繁体   English   中英

gdb 在 linux 上调试多线程守护程序时如何中断新线程

[英]gdb how to break in new thread when debugging multi threaded daemon program on 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中使用信息线程查看您期望看到的线程是否正在实际运行。 您可以从调试器开始而不是附加吗? 通过开始然后附加,您可能会缺少有趣的部分。 尝试在类似pthread_create()的对象上设置断点,以查看是否正在创建线程。 有我的0.02美元

必须在这里做出响应...如果您可以访问源,为了方便起见,我已在其他任何地方都未调用的伪函数上设置了断点。 我认为可以检查的其他事项是您是否使用符号进行了编译。 它是静态链接的吗(静态链接时,没有符号就不能破坏libc的东西)。 有点用光了,也许其他人会有更好的主意?

我发现了一种可行的解决方法:-)

虽然我仍然无法让gdb在我感兴趣的断点处中断(发生在主线程产生的短暂线程中),但我找到了一种在该线程结束之前尽快显式切换到该线程的方法。

问题是gdb需要您显式切换到您感兴趣的线程,以在断点处停止。

因为我要调试的线程寿命很短,所以我不能足够快地(在完成之前)切换到该线程。

除了我感兴趣的功能的断点外,我还在记录器函数中放置了另一个断点,该断点经常在所有线程中发生,并一直持续(肯定很烦人),直到产生我感兴趣的线程,然后在出现此情况时明确切换到该线程产生新线程并列出线程。

(gdb) info threads
(gdb) Thread <thread id>

我将其发布,因此如果您有类似的问题,可以尝试此解决方法。

您的评论,更好的答案:-)欢迎更多回复

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM