【发布时间】:2016-10-30 04:33:53
【问题描述】:
环境
Qt 5.6.1 Qt 创作者 4.0.1 数据库 7.11 Ubuntu 16.04 LTS
场景
C:与M通信的客户端应用程序。
M:一个经理进程通知L启动一个新进程T。
L:一个 Launcher 进程,通过 fork 自身来启动新的 T。
T:一个新进程在后台运行。
我能够在 Qt 中使用 gdb 运行测试应用程序并调试进程 C。但我无法调试 T。
这是我尝试调试 T 的方式:
在C和T中都设置断点; 当断点被击中时。我使用 Qt 菜单选项“调试”->“开始调试”->“附加到正在运行的应用程序”。尝试将调试器附加到 T 进程。 这是我遇到的问题 而不是达到我在 T 中设置的断点。 gdb 总是在函数 epoll_wait() 中遇到不可见的断点。之后,如果我继续 (F5)。应用程序将继续挂起,而不会在 T 中遇到任何进一步的断点。除非我通过使用 Qt 调试选项“停止调试器”来强制停止。该应用程序正在等待。在我停止调试器后,C 仍然在原始断点处中断。
Qt中调试器的问题
Qt 似乎为不同的进程使用了两个不同的调试器。我认为这可能是由 C 挂起引起的。所以 T 进程一直在等待。但是我没有在 wrap_epoll_wait() 函数中设置任何断点我不确定为什么 gdb 会在那里中断。在 Qt 调试器中。我找不到切换回 C 进程以让进程继续运行的方法。 (Qt 调试器组件“线程”下拉列表由于某种原因被禁用,我无法选择其他线程)。
我尝试过的事情
- 修改 /etc/sysctl.d/10-ptrace.conf 设置 kernel.yama.ptrace_scope 值为 0
- 在 Qt 中打开和关闭了调试器选项“Tools->Options->Debugger->GDB Extended->Debug all children”。
以上都没有改变调试器在函数 wrap_epoll_wait() 中中断后调试器挂起的事实。
我的问题
任何熟悉 gdb 和 Qt 知识的人都可以帮助我吗?让我知道 gdb 调试多个进程在 Qt 中是如何工作的?如何在不同进程之间切换调试器以及为什么 gdb 在我没有设置断点的地方中断?
非常感谢,
荣
【问题讨论】:
-
更好地收集带有时间/进程ID/线程ID的日志以进行调试。调试器中的断点可能会有所帮助,但前提是您知道将断点放在哪里。
标签: c qt debugging gdb multiprocess