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)。
当我们使用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)。