使用ARM跨工具链进入同一文件中定义的功能时出现分段错误

问题描述

我有这个简化的例子,

int myf(void) {
    int a = 1;
    int b = 2;
    return a + b;
}

int main(void) {
    int sum = myf();  // <--- bp here
    printf("Result: %d\n",sum);
    return 0;
}

我在int sum = myf()一个断点,并且运行调试器。 Gdb已成功停止,但是进入命令(进入myf)会导致分段错误。如果我直接在myf中放一个bp并运行调试器,则调试器将按预期的方式停止在那儿,这没问题。在共享库中,断点都不起作用。它们被完全忽略。进入共享库代码会导致相同的分段错误错误

跳过功能也被“破坏”。跳过代码有时会跳到随机的位置(我认为),例如在名为dl-minimal.c

文件

如果只是运行而不调试,则代码的行为符合预期。

当我遇到分段错误时在调试器控制台中获得的其他有用信息:

  • 没有函数包含指定的地址
  • 反汇编程序失败:无法访问地址0xe7f001dc处的内存

有关完整的dbg控制台输出,请参见打印屏幕:

enter image description here

仅当将交叉工具链用于ARM板(i.MX6)时,该错误才可重现。在Linux机器上进行本地调试时,我没有这样的问题。我正在使用qtCreator 5.15。我的跨工具链是使用yocto和bitbake构建的。

关于可能原因的任何提示吗?

解决方法

Tools->Options->Debugger中设置GDB搜索路径。在Additional Startup Commands框中。在那里放置正确的sysroot(对应于您从其运行的平台),并从本地计算机遵循共享库调试构建的完整路径。

此外,请确保以普通用户身份运行(在{{1}中设置)-尽管部署时需要切换为root用户。