gdb如何连接到多线程进程

how does gdb attach to multithread process

本文关键字:多线程 进程 连接 何连接 gdb      更新时间:2023-10-16

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

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

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

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

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

$ strace -e ptrace -p GDB_PROCESS_PID

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

ptrace PTRACE_ATTACH向进程发送SIGSTOP,该进程将挂起整个进程,即所有线程。

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

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