繁体   English   中英

gdb如何附加到多线程进程

[英]how does gdb attach to multithread process

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

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

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

ptrace PTRACE_ATTACHSIGSTOP发送到该进程,该进程将挂起整个进程,即所有线程。

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

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

$ strace -e ptrace -p GDB_PROCESS_PID

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM