Qt 使用 gdb 调试附加进程
Qt using gdb to debug an attached process
环境
Qt 5.6.1
Qt 创作者 4.0.1
gdb 7.11
Ubuntu 16.04 LTS
场景
C:与M.
通信的客户端应用程序
M: 一个管理进程通知L启动一个新进程T。
L:启动器进程通过分叉自身来启动新的 T。
T: 新进程运行正在后台运行。
我能够 运行 在 Qt 中使用 gdb 测试应用程序和调试进程 C。但是我无法调试 T.
这是我尝试调试 T 的方法:
在C和T都设置断点;
当遇到断点时。我使用 Qt 菜单选项 "Debug"->"Start Debugging"->"Attach to running application"。尝试将调试器附加到 T 进程。
这是我遇到的问题
而不是命中我在 T 中设置的断点。 gdb 总是在函数 epoll_wait() 中遇到不可见的断点。之后,如果我继续 (F5)。应用程序将继续挂起,而不会在 T 中命中任何进一步的断点。除非我使用 Qt 调试选项 "Stop Debugger" 强制停止。该应用程序正在等待。在我停止调试器后,C 仍然在原来的断点处中断。
Qt调试器的问题
Qt 似乎对不同的进程使用了两种不同的调试器。我认为这可能是 C 挂起造成的。所以 T 进程一直在等待。但是我没有在 wrap_epoll_wait() 函数中设置任何断点我不确定为什么 gdb 会在那里中断。在 Qt 调试器中。我找不到办法切换回 C 进程,让进程继续到 运行。 (Qt 调试器组件 "Threads" 下拉列表由于某种原因被禁用,我不能 select 不同的线程)。
我尝试过的东西
- 修改/etc/sysctl.d/10-ptrace.conf设置kernel.yama.ptrace_scope值为0
- 在 Qt 中打开和关闭调试器选项 "Tools->Options->Debugger->GDB Extended->Debug all children"。
None 上面的事情改变了调试器在函数 wrap_epoll_wait().epoll_wait().
中断后挂起的事实
我的问题
任何精通 gdb 和 Qt 知识的人都可以帮助我吗?让我知道 gdb 调试多进程在 Qt 中是如何工作的?如何在不同进程之间切换调试器以及为什么 gdb 在我没有设置断点的地方中断?
非常感谢,
容
因为 T 通过从 L 分叉创建。 gdb设置'set follow-fork-mode'需要在Qt creator中设置为'child'
环境
Qt 5.6.1 Qt 创作者 4.0.1 gdb 7.11 Ubuntu 16.04 LTS
场景
C:与M.
通信的客户端应用程序M: 一个管理进程通知L启动一个新进程T。
L:启动器进程通过分叉自身来启动新的 T。
T: 新进程运行正在后台运行。
我能够 运行 在 Qt 中使用 gdb 测试应用程序和调试进程 C。但是我无法调试 T.
这是我尝试调试 T 的方法:
在C和T都设置断点; 当遇到断点时。我使用 Qt 菜单选项 "Debug"->"Start Debugging"->"Attach to running application"。尝试将调试器附加到 T 进程。 这是我遇到的问题 而不是命中我在 T 中设置的断点。 gdb 总是在函数 epoll_wait() 中遇到不可见的断点。之后,如果我继续 (F5)。应用程序将继续挂起,而不会在 T 中命中任何进一步的断点。除非我使用 Qt 调试选项 "Stop Debugger" 强制停止。该应用程序正在等待。在我停止调试器后,C 仍然在原来的断点处中断。
Qt调试器的问题
Qt 似乎对不同的进程使用了两种不同的调试器。我认为这可能是 C 挂起造成的。所以 T 进程一直在等待。但是我没有在 wrap_epoll_wait() 函数中设置任何断点我不确定为什么 gdb 会在那里中断。在 Qt 调试器中。我找不到办法切换回 C 进程,让进程继续到 运行。 (Qt 调试器组件 "Threads" 下拉列表由于某种原因被禁用,我不能 select 不同的线程)。
我尝试过的东西
- 修改/etc/sysctl.d/10-ptrace.conf设置kernel.yama.ptrace_scope值为0
- 在 Qt 中打开和关闭调试器选项 "Tools->Options->Debugger->GDB Extended->Debug all children"。
None 上面的事情改变了调试器在函数 wrap_epoll_wait().epoll_wait().
中断后挂起的事实我的问题
任何精通 gdb 和 Qt 知识的人都可以帮助我吗?让我知道 gdb 调试多进程在 Qt 中是如何工作的?如何在不同进程之间切换调试器以及为什么 gdb 在我没有设置断点的地方中断?
非常感谢,
容
因为 T 通过从 L 分叉创建。 gdb设置'set follow-fork-mode'需要在Qt creator中设置为'child'