远程 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 在每次事件时停止的主要内容,如果未能解决你的问题,请参考以下文章