This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM5716:am5716 在 sdk6.3 中、使用工具链 gcc 编译 C++代码、然后 exec 无法打印中止栈

Guru**** 2551110 points
Other Parts Discussed in Thread: AM5716

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1568433/am5716-am5716-in-sdk6-3-use-toolchain-gcc-compile-c-code-then-exec-cannot-print-abort-stack

器件型号:AM5716
主题中讨论的其他器件: TDA2

工具/软件:

#include <iostream>
#include <cstring>
#include <string>
#include <cassert>

static void VersionProtocolTrans(std::string version, int iVerAdder, int iLenVersion, uint16_t *aVerDate) {
    int iIsEvenNumber = 0;
    uint16_t iTransData = 0;
    int iIvalueIndex = 0;
    for (auto c : version) { // 这里会触发SIGABRT
        if (c != '\'') {
            if ((uint16_t)c != 0) {
                if (!(iIsEvenNumber % 2)) {
                    iTransData += (uint16_t)c << 8;
                } else {
                    iTransData += (uint16_t)c;
                }
                iIsEvenNumber++;
                if (!((iIsEvenNumber - 2) % 2)) {
                    aVerDate[iIvalueIndex++] = iTransData;
                    iTransData = 0;
                }
            }
        }
    }
    if (iTransData) {
        aVerDate[iIvalueIndex++] = iTransData;
    }
    if (version == "--") {
        for (int j = 1; j <= iLenVersion - 1; j++) {
            aVerDate[j] = 0;
        }
    }
}

int main()
{
    // 直接触发assert失败
    std::string version = "1234567890ab";
    
    // 强制触发一个断言失败
    assert(false); // 这会直接调用abort()
    
    uint16_t aSecVer[1] = {0};
    VersionProtocolTrans(version, 0, 12, &aSecVer[0]);
    return 0;
}
/

arm-linux-gnueabihf-g++-std=c++11 -g -O0 -Wall -Werror testplus.cpp -o test_cpp  

上面的演示使用由此生成的编译后的可执行文件在较旧的 AM335x (SDK ti-SDK-am335x-evm-07.00.00.00) 上运行、并显示内核的行号。而在 am5716 中、则不是在 sdk6.3 中运行

AM335x:

am5716:

您能否提供一些指导、说明如何像 AM335x 中那样在 am5716 中实现这样一个详细的栈?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 zmg、

    此程序是如何编译的?  
    我们的 SDK 中有一些关于如何在 SDK 中编译程序的信息: https://software-dl.ti.com/processor-sdk-linux/esd/docs/06_03_00_106/linux/Overview/GCC_ToolChain.html

    请参阅 交叉编译的库。

    -Josue

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    arm-linux-gnueabihf-g++-std=c++11 -g -O0 -wall -Werror testplus.cpp -o test_cpp
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    arm-linux-gnueabihf-g++-std=c++11 -g -O0 -wall -Werror testplus.cpp -o test_cpp
     

    MaGuang

      ------------------------

    -rwxr-xr-x 1 根根 67828 Sep 23 2025 test_cpp
    root@am57xx-EVM:/home#./test_cpp
    test_cpp:testcpp.cpp:42:int main():断言`false'失败。
    中止(核心饺子

    --------------------------------

    此致

      Semon

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid=“619556" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1568433/am5716-am5716-in-sdk6-3-use-toolchain-gcc-compile-c-code-then-exec-cannot-print-abort-stack

    上面的演示使用由此生成的编译后的可执行文件在较旧的 AM335x (SDK ti-SDK-am335x-evm-07.00.00.00) 上运行、并显示内核的行号。而在 am5716 中、则不是在 sdk6.3 中运行

    AM335x:

    [/报价]

    嗨、MaGuang

      请在此处查看 coredump 日志:

      ----------------------------------------------------

    root@am57xx-EVM:/home# gdb test_cpp core.test_cpp.0.363546aba87a42a0a3cf9653b706db34.1258.1587262988000000
    GNU gdb (GDB) 8.2.
    版权所有 (C) 2018 Free Software Foundation, Inc.
    GPLv3 许可证:GNU GPL 版本 3 或更高版本
    这是自由软件:您可以自由更改和重新分发它。
    在法律允许的范围内、不提供任何保证。
    键入“显示复制“和“显示保修“以了解详细信息。
    该 GDB 配置为“arm-linux-gnueabi"。“。
    键入“show configuration“以了解配置详细信息。
    有关错误报告说明、请参阅:

    在线查找 GDB 手册和其他文档资源:

    要获得帮助、请键入“Help"。“。
    键入“apropos word“以搜索与“word"相关“相关的命令...
    从 TEST_cpp...DONE 读取符号。

    警告:Exec 文件比 Core 文件新。
    [新 LWP 1258]

    内核由“./test_cpp"`“`。
    使用信号 SIGABRT 终止程序、已中止。
    #0 __GI_RAISE (sig = sig@entry=6) 位于./sysdeps/unix/sysv/linux/raise.c:50
    50 ../sysdeps/unix/sysv/linux/raise.c:没有此类文件或目录。
    (gdb)
    (gdb) bt
    #0 __GI_RAISE (sig = sig@entry=6) 位于./sysdeps/unix/sysv/linux/raise.c:50
    _GI_ABORT () 中的#1 0xb6c2e208 位于 ABORT.c:79 处
    #2 0xb6c3b384 in __assert_fail_base (fmt=0xb6d370ec “%s%s%s:%u:%s%sAssertion `%s' failed.\n%n“、asseration=0x10cc4 “false",“,asseration、asseration@entry=0xb6fb32f0“",“,</s>、
    file=0x10cb8 “testcpp.cpp",“,file、file@entry=0x10ccc “int main()“、line=42、line@entry=68792、
    Function=function@entry=0x10ccc assert.c:92 处的“int main ()“
    _GI__ASSERT_FAIL 中的#3 0xb6c3b434(生效=0xb6fb32f0 “",“,FILE=0x10ccc、FILE=0x10ccc “Int main()“、line=68792、
    函数=0x10ccc assert.c:101 处的“int main ()“
    位于 testcpp.cpp:42 处 main () 中的#4 0x00010a8c
    (gdb)

    ------------------------------------

    你的概率是多少?

    ----------------------------------------

    此致

     Semon

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    MaGuang

      编译命令:

    ----------------------------

    R-diff.patch processor_sdk_rtos_am57xx_06_03_02_08 testcpp.cpp
    M_CAN          驱动程序                   TI-PROCESSOR-SDK-LINUX-am57xx-EVM-06.03.00.106
    m_can.tar.gz      securityboot               ti-processor-sdk-linux-am57xx-evm-09_03_06_05-Linux-x86-Install.bin
    (base) Semon@SemonHP:~/tda2$ arm-linux-gnueabihf-g++-std=c++11 -g -O0 -Wall -Werror -o test_cpp testcpp.cpp  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     我们现在使用的是 TI-PROCESSOR-SDK-LINUX-am57xx-EVM-06.03.00.106/、但是 gdb 是由一位同事编译的、其中没有这样的内容。  让我们试一下您的操作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    MaGuang

      1.gdb

        e2e.ti.com/.../gdb

    2.  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Semon

    请告诉我这个命令: hexdump -C /lib/libc.so.6 |grep 版本