c - gdb在linux上调试多线程守护程序时如何中断新线程
问题描述
在问这个问题之前 - 我参考了gdb 多线程调试如何与 Linux 线程调度协调?添加上下文
我有一个在 linux 上运行的 c++ 守护进程多线程程序。它每次处理事务时都会启动一个线程。要调试的代码是在新线程中调用的事务处理代码的一部分。
这是我调试的过程。
我启动gdb,关闭分页,打开同步命令执行并设置不间断模式。
然后我将 gdb 附加到正在运行的守护程序并在“所有”线程上设置断点(见下图)并发送一个新事务。
问题是 gdb 似乎清楚地通知我断点在线程 1 中。我没有在新线程中的断点处中断。当我发送一个新事务并退出而不在断点处中断时,会创建一个新线程。
请帮助我了解可能的原因是什么(我错过了什么)
(gdb) set pagination off
(gdb) set target-async on
(gdb) set non-stop on
(gdb) attach 11067 # <daemon pid>
(gdb) thread apply all b foo
Thread 1 (Thread 0x7f94bb9f3740 (LWP 11067)): Breakpoint 1 at <filename> ,
line <line#>
(gdb) c
Continuing.
[New Thread 0x7f94b725e700 (LWP 15750)]
[Thread 0x7f94b725e700 (LWP 15750) exited]
问题是 - 它没有中断函数“foo”(我的断点)
我错过了什么?我如何指示 gdb 跟随新的子线程。“线程全部应用”不应该应用于“所有”线程吗?
解决方案
我找到了一个可行的解决方法:-)
虽然我仍然无法让 gdb 在我感兴趣的断点处中断(发生在由主线程产生的短暂线程中),但我找到了一种在该线程结束之前尽快显式切换到该线程的方法。
问题是 gdb 需要您显式切换到您感兴趣的线程,以在断点处停止。
因为我试图调试的线程相当短暂,所以我不能很快切换到它(在它完成之前)。
除了我感兴趣的函数中的断点之外,我在一个记录器函数中放置了另一个断点,该函数经常在所有线程中发生并一直继续(肯定很烦人)直到我感兴趣的线程被产生,然后当通过列出线程产生了新线程。
(gdb) info threads
(gdb) Thread <thread id>
我发布了这个,所以如果你有类似的问题,你可以尝试这个解决方法。
您的评论,更好的答案:-) 欢迎更多回复
推荐阅读
- linux - 套接字传入连接不能同时 push_back 元素到全局定义的 std::vector
- javascript - 如何在 iOS 上为 Chrome 或 Safari 停止滚动 - CSS/JavaScript 或 jQuery
- formula - 系统注释旧值比新值大或小 x%
- swift - 如何确定 Swift String 的显示计数?
- vue.js - 为什么不能将 Vue.js 响应式属性直接添加到根模型?
- r - 从 R 会话临时修改 PATH 变量
- php - 如何在一个视图中从两个表中获取多列数据
- function - 如何在 Apache Pulsar 中为 docker 创建函数
- regex - .* 未正确捕获逗号
- python - 无法使用命名引用 URI 签署 xmlsec