远程 gdb 在每次事件时停止

Posted

技术标签:

【中文标题】远程 gdb 在每次事件时停止【英文标题】:Remote gdb stops at every event 【发布时间】:2016-03-30 13:57:31 【问题描述】:

我有需要调试的远程 ARM Linux 机器。

服务器已启动:

gdbserver :12345 ./my_app

客户:

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

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

[Inferior 1 (process 2766) exited with code 01]

在服务器上:

孩子以状态 1 退出 GDBserver 退出

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

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

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

set sysroot /home/karel/sysroot

我可以设置断点并且应用程序会在它们处停止。然而,暂停仍在停止远程应用程序。 QtCreator 也一样:Tools->Options->Debugger->GDB->Additional Attach Commands

【问题讨论】:

您需要什么设备? ironlab.io 允许在云端的真实设备上进行调试。它们现在处于免费测试阶段。 【参考方案1】:

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

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

经过一番研究,我终于找到了对 Qt 5.5 的以下提交:Fix up signal handling in QFbVtHandler。最后,您会看到当接收到 SIGINT 或 SIGTERM 时,handleInt() 处理程序在我们最终遇到_exit(1) 的地方被调用。在此处设置断点确认这正是尝试使用 GDB 暂停或设置断点时发生的情况。

对我有用的解决方案:我为 qfbvthandler.cpp 创建了一个补丁,只需删除 #define VTH_ENABLED 行。

GDB 调试现在又像魅力一样工作了。

注意:即使 qfbvthandler.cpp 已在 Qt5.6 及更高版本中更新,我怀疑其行为仍将相同。但是,我没有设置工作区来测试它。

【讨论】:

以上是关于远程 gdb 在每次事件时停止的主要内容,如果未能解决你的问题,请参考以下文章

收到“/:未找到事件”。使用 PyCharm 远程调试器时

GDB远程调试,好像找不到符号

VS2017创建Linux项目实现远程GDB调试

如何在 GDB 中使用跟踪

GDB 在远程调试期间挂起,库版本不匹配

一文掌握vscode远程gdb调试