当我们使用gdb attach
调试正在运行的进程时,我们可以使用gdb attach pid
,如果进程有两个或更多线程,则pid是主线程tid。
现在我想实现一个简单的调试器来调试多线程进程,但是当我使用我的调试器来附加多线程进程时,只有main thread
被挂起。
我想知道为什么只使用主线程tid,gdb
可以附加这个进程的所有线程,gdb如何挂起所有线程?我们假设当我们使用gdb attach
时,所有线程都已创建。
答案 0 :(得分:2)
ptrace PTRACE_ATTACH
将SIGSTOP
发送到暂停整个过程即所有线程的进程。
答案 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附加到进程时,该进程的所有线程都将被挂起。