gdb如何附加到多线程进程

how does gdb attach to multithread process

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

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

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

主线程TID与进程PID数值相同是Linux系统的历史事故;在其他 Unix 系统上不是这样。

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

ptrace PTRACE_ATTACH 发送 SIGSTOP 到挂起整个进程的进程,即所有线程。

I want to know why only use the main thread tid, the gdb can attach all thread of this process, how does gdb suspend all the threads?

当您执行 attach PROCESS_PID gdb 内部调用 ptrace (PTRACE_ATTACH) 每个线程 。在 Linux 你可以自己检查:

$ strace -e ptrace -p GDB_PROCESS_PID

只是 运行 一个有几个线程的程序,运行 gdb 并且在 运行ning 之前在另一个控制台中附加 PROCESS_PID 运行 strace。您必须看到每个线程的 ptrace (PTRACE_ATTACH)。