在问这个问题之前-我提到How does gdb multi-thread debugging coordinate with Linux thread scheduling?来添加上下文
我有一个在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遵循新的子线程。
难道“线程全部应用”不应该应用于“所有”线程吗?
答案 0 :(得分:0)
我没有足够的声誉来发表评论,但是无论如何,由于大脑抽筋检查您的gdb会话并没有显示您实际上在创建断点。从gdb中使用信息线程查看您期望看到的线程是否正在实际运行。您可以从调试器开始而不是附加吗?通过开始然后附加,您可能会缺少有趣的部分。尝试在类似pthread_create()的对象上设置断点,以查看是否正在创建线程。那是我的0.02美元
必须在这里做出响应...如果您可以访问源代码,为方便起见,我已在其他任何地方都未调用的伪函数上设置了断点。我认为可以检查的其他事项是您是否使用符号进行了编译。它是静态链接的吗(静态链接时,没有符号就不能破坏libc的东西)。有点用光了,也许其他人会有更好的主意?
答案 1 :(得分:0)
我找到了一种可行的解决方法:-)
虽然我仍然无法让gdb在我感兴趣的断点处中断(发生在主线程产生的短暂线程中),但我找到了一种在该线程结束之前尽快显式切换到该线程的方法。 / p>
问题是gdb需要您明确切换到您感兴趣的线程,以在断点处停止。
由于我要调试的线程寿命很短,因此我无法尽快(在完成之前)切换到该线程。
除了我感兴趣的功能的断点外,我还在记录器函数中放置了另一个断点,该断点经常在所有线程中发生,并且一直持续(肯定令人讨厌),直到产生我感兴趣的线程,然后切换到在产生新线程时并通过列出线程来明确显示。
(gdb) info threads
(gdb) Thread <thread id>
我正在发布此消息,因此,如果您遇到类似的问题,可以尝试此变通办法。
您的评论,更好的答案:-)欢迎更多回复