使用 ARM 交叉工具链进入同一文件中定义的函数时出现分段错误
Segmentation fault when stepping into a function defined in the same file using an ARM cross-toolchain
我有这个简化的例子,
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 控制台输出的打印屏幕:
该错误仅在对 ARM 板 (i.MX6) 使用交叉工具链时可重现。我在 Linux 机器上本地调试时没有这样的问题。我正在使用 qtCreator 5.15。我的交叉工具链是用 yocto 和 bitbake 构建的。
关于可能原因的任何提示?
设置 GDB 搜索路径 - 在 Tools->Options->Debugger
中。在 Additional Startup Commands
框中。将正确的 sysroot 放在那里(对应于您 运行ning 来自的平台),然后从本地机器跟随共享库调试构建的完整路径。
此外,请确保 运行 作为普通用户(在 Tools->Options->Devices
中设置)- 尽管您在部署时需要切换到 root 用户。
我有这个简化的例子,
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 控制台输出的打印屏幕:
该错误仅在对 ARM 板 (i.MX6) 使用交叉工具链时可重现。我在 Linux 机器上本地调试时没有这样的问题。我正在使用 qtCreator 5.15。我的交叉工具链是用 yocto 和 bitbake 构建的。
关于可能原因的任何提示?
设置 GDB 搜索路径 - 在 Tools->Options->Debugger
中。在 Additional Startup Commands
框中。将正确的 sysroot 放在那里(对应于您 运行ning 来自的平台),然后从本地机器跟随共享库调试构建的完整路径。
此外,请确保 运行 作为普通用户(在 Tools->Options->Devices
中设置)- 尽管您在部署时需要切换到 root 用户。