我有这个简化的例子,
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
的文件中。如果代码只是简单地运行而不是调试,它的行为将符合预期。
当我收到段错误错误时,我在调试器控制台中获得的其他有用信息:
查看完整的 dbg 控制台输出的打印屏幕:
仅当对 ARM 板 (i.MX6) 使用交叉工具链时,该错误才可重现。在 Linux 机器上进行本地调试时,我没有这样的问题。我正在使用 qtCreator 5.15。我的跨工具链是用 yocto 和 bitbake 构建的。
关于可能原因的任何提示?
最佳答案
设置 GDB 搜索路径 - 在 Tools->Options->Debugger
.在 Additional Startup Commands
盒子。将正确的 sysroot 放在那里(对应于您正在运行的平台),然后从本地计算机跟随您的共享库调试构建的完整路径。
此外,请确保以普通用户身份运行(在 Tools->Options->Devices
中设置) - 尽管在部署时需要切换到 root 用户。
关于c++ - 使用 ARM 跨工具链进入同一文件中定义的函数时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63469757/