gdb如何连接到多线程进程
how does gdb attach to multithread process
当我们使用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连接到进程时,该进程的所有线程都将挂起。
相关文章:
- 在C++中使用cURL和多线程
- 多线程:线程或进程.h - C++
- 优化吞吐量:多线程与多进程
- 多个线程/进程是否可以在不同步的情况下同时从/写入文件的非重叠区域?
- 多线程中的 std::basicstring 的运行时分段错误C++点燃进程
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- 使用 c++ 的多线程和并行进程
- 与多线程一起登录多进程应用程序
- 多线程排挤了其他进程
- C++如何检查文件是否在使用-多线程多进程系统
- 多线程和多进程应用程序的锁定机制之间有什么区别
- gdb是如何连接到多线程进程的
- 提振.Asio复合操作在单线程和多线程进程
- c++多线程和进程中的向量
- gdb如何连接到多线程进程
- 独立的多线程进程同时阻塞
- 在多线程进程中处理信号的示例
- 多线程进程中的信号处理
- 多线程/分叉服务器守护进程的模型
- 如果一个且只有一个线程被停止,可以从多线程进程中跟踪读/写数据