远程gdb在每次事件时都会停止

Remote gdb stops at every event

本文关键字:事件 gdb 远程      更新时间:2023-10-16

我有一个需要调试的远程ARM Linux盒子。

服务器启动:

gdbserver :12345 ./my_app

客户:

./arm-am3354-linux-gnueabihf-gdb ~/
 (gdb) target remote dev_r:12345
 (gdb) continue

然后我试图用Ctrl+C暂停应用程序,但gdb停止了:

[劣1(过程2766)退出,代码为01]

在服务器上:

子项退出,状态为1GDB服务器退出

故事:我试图在QtCreator中使用远程调试,但在运行时设置断点时,gdb也以同样的方式崩溃。此外,断点和暂停在QtCreator中也不起作用。我也在尝试另一个类似gdb-multiarch的gdb和来自android sdk的gdb。

更新:调试小程序,又名Hello World工作。本地调试(在x86上)也可以。该应用程序本身有十万行代码、共享库和静态库。

部分解决方案:可能我得到的嵌入式平台的sysroot是无效的。从目标设备复制/lib/和/usr/并将其设置为之后

set sysroot /home/karel/sysroot

我可以设置断点,应用程序会在断点处停止。然而,暂停仍然会停止远程应用程序。QtCreator也是如此:工具->选项->调试器->GDB->附加附加命令

我在调试在EGLFS平台上运行的应用程序时遇到了类似(甚至完全相同?)的问题。使用Qt 5.4构建时的调试工作非常好,使用Qt 5.5进行的调试确实如您所描述的那样。

经过数小时的搜索,我发现我在Qt 5.5上的应用程序在收到SIGINT时退出,而在Qt 5.4上,调试器可以按预期暂停应用程序。由于GDB在尝试暂停应用程序或设置/删除断点时发送SIGINT,因此这就是问题的根源。

经过更多的研究,我终于找到了以下对Qt 5.5的承诺:修复QFbVtHandler中的信号处理。最后,您可以看到,当接收到SIGINT或SIGTERM时,会调用handleInt()处理程序,在那里我们最终运行到_exit(1)。在那里设置断点证实了这正是在尝试暂停或使用GDB设置断点时发生的情况。

适用于我的解决方案:我创建了qfbvthandler.cpp的补丁,只需删除#define VTH_ENABLED行。

GDB调试现在又像魅力一样发挥作用了。

注意:尽管qfbvthandler.cpp在Qt5.6及更高版本中进行了更新,但我怀疑其行为仍然相同。然而,我没有设置一个工作区来测试这一点。