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

标签 c linux multithreading debugging gdb

在问这个问题之前 - 我提到了 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 关注新的子线程。 “thread apply all”不是应该应用于“所有”线程吗?

最佳答案

我找到了一个可行的解决方法 :-)

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

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

由于我尝试调试的线程存在时间很短,所以我无法尽快切换到它(在它完成之前)。

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

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

我发布了这个,所以如果您有类似的问题,您可以尝试这个解决方法。

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

关于c - gdb 如何在 linux 上调试多线程守护程序时中断新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55067510/

相关文章:

python - 我有 python 文件名 MiscTest.py,现在我想在 linux 中运行这个文件,只有一个名字 MiscTest

c++ - 如何动态生成和运行 native 代码?

c# - 我如何测试 FileSystemWatcher 引发正确的事件?

c - GCC 打印 cc1 而不是行号

c - 奇怪的 cscope 命令行限制

linux - LIDT的操作数是位移/绝对地址

multithreading - 当另一个线程等待这个 epoll 描述符时,我可以将套接字添加到 epoll 描述符吗?

Python threading.Timer 只重复一次

c - 错误的实现使用哈希表搜索记录。未找到结果?

c - 写入文件并使用带循环的 if 语句