c++ - 远程 gdb 在每个事件中停止

标签 c++ linux gdb gdbserver

我有一个需要调试的远程 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]

在服务器上:

Child exited with status 1 GDBserver exiting

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

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

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

set sysroot /home/karel/sysroot

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

最佳答案

我在调试在 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 及更高版本中更新,我怀疑行为仍然相同。但是,我没有设置工作区来对此进行测试。

关于c++ - 远程 gdb 在每个事件中停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36311032/

相关文章:

linux - Linux 中文件夹的前缀,使它们保持在第一个位置

c - C 中的信号排队

c - 为什么每次运行时堆栈使用量不同而不是固定数量时会发生堆栈溢出?

iphone - 将应用程序部署到越狱的 iPhone 后,GDB 会出现奇怪的行为

c - 如何使用gdb调试?

c++ - 突破 C++ 中的递归和原始函数

c++ - 使用 shared_from_this 时出现 std::bad_weak_ptr 异常

c++ - 我应该如何在一个大型的、不熟悉的软件项目中调试 SIGFPE?

c++ - C++中的函数名冲突

c++ - 对象 vector 中的内存访问冲突