gdb如何附加到多线程进程

时间:2015-07-03 08:37:19

标签: c++ c multithreading gdb ptrace

当我们使用gdb attach调试正在运行的进程时,我们可以使用gdb attach pid,如果进程有两个或更多线程,则pid是主线程tid。

现在我想实现一个简单的调试器来调试多线程进程,但是当我使用我的调试器来附加多线程进程时,只有main thread被挂起。

我想知道为什么只使用主线程tid,gdb可以附加这个进程的所有线程,gdb如何挂起所有线程?我们假设当我们使用gdb attach时,所有线程都已创建。

3 个答案:

答案 0 :(得分:2)

ptrace PTRACE_ATTACHSIGSTOP发送到暂停整个过程即所有线程的进程。

答案 1 :(得分:2)

  

我想知道为什么只使用主线程tid,gdb可以附加这个进程的所有线程,gdb如何挂起所有线程?

执行attach PROCESS_PID gdb时,内部会为每个帖子调用ptrace(PTRACE_ATTACH) 。在Linux上,你可以自己检查:

$ strace -e ptrace -p GDB_PROCESS_PID

只需运行几个线程的程序,运行gdb,然后在另一个控制台中运行attach PROCESS_PID run strace。您必须为每个线程看到ptrace(PTRACE_ATTACH)。

答案 2 :(得分:0)

与进程PID具有相同数值的主线程TID是Linux系统的历史事故;在其他Unix系统上并非如此。

当gdb(或任何调试器)使用ptrace附加到进程时,该进程的所有线程都将被挂起。