c - Qt 使用 gdb 调试附加进程

标签 c qt debugging gdb multiprocess

环境

Qt 5.6.1 Qt 创建者 4.0.1 数据库7.11 Ubuntu 16.04 LTS

场景

C:与M通信的客户端应用程序。

M:管理器进程,通知L启动新进程T

L:通过 fork 自身来启动新T的启动器进程。

T:在后台运行的新进程。

我能够使用 gdb 在 Qt 中运行测试应用程序并调试进程 C。但我无法调试 T

这是我尝试调试T的方法:

CT中设置断点; 当断点被击中时。我使用 Qt 菜单选项“调试”->“开始调试”->“附加到正在运行的应用程序”。尝试将调试器附加到T进程。 这就是我遇到的问题 而不是点击我在 T 中设置的断点。 gdb 总是在函数 epoll_wait() 中遇到不可见的断点。之后,如果我继续(F5)。应用程序将继续挂起,不会再遇到 T 中的任何断点。除非我使用 Qt 调试选项“停止调试器”强制停止。申请继续等待。在我停止调试器后,C 仍然在原始断点处中断。

Qt中调试器的问题

Qt 似乎对不同的进程使用了​​两种不同的调试器。我认为这可能是由于 C 挂起造成的。所以T过程就是继续等待。但我没有在wrap_epoll_wait()函数中设置任何断点,我不确定为什么gdb在那里中断。并在 Qt 调试器中。我找不到切换回C进程以让该进程继续运行的方法。 (Qt 调试器组件“线程”下拉列表由于某种原因被禁用,我无法选择不同的线程)。

我尝试过的事情

  1. 修改了/etc/sysctl.d/10-ptrace.conf,将 kernel.yama.ptrace_scope 值设置为 0
  2. 在 Qt 中打开和关闭调试器选项“工具 -> 选项 -> 调试器 -> GDB 扩展 -> 调试所有子项”。

上述事情都没有改变调试器在函数wrapp_epoll_wait()中中断后调试器挂起的事实。

我的问题

任何精通 gdb 和 Qt 知识的人都可以帮助我吗?让我知道 gdb 调试多进程在 Qt 中是如何工作的?如何在不同进程之间切换调试器以及为什么 gdb 在我没有设置断点的地方中断?

非常感谢,

最佳答案

TL fork 创建以来。在 Qt 创建者中,gdb 设置'set follow-fork-mode'需要设置为'child'

引用: https://sourceware.org/gdb/onlinedocs/gdb/Forks.html

关于c - Qt 使用 gdb 调试附加进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38066201/

相关文章:

c - 为什么即使我反转了两个参数,这个函数调用仍然有效?

c程序将一个int分配给一个bool?

c - 问题打印矩阵值

QThread 和 C++11 lambda : wait for finished

qt - WebView显示空白白屏

c++ - 识别asm中的地址计算insns

sql-server-2008 - 在 SSMS 中调试时可以设置条件断点吗?

c - 数组函数(图像处理项目)

windows - 我如何在 Windows XP 上部署 Qt 5.10 Quick 2 应用程序?

linux - GDB:暂时重定向目标标准输出