如何用ptrace可靠且透明地追踪非子进程的所有线程?
非子进程全线程追踪的需求与方案困境
我正在开发一款小型工具,需追踪另一个运行中的非子进程的所有现有线程,核心要达成两个目标:
- 可靠避免与tracee进程在线程创建、终止时的竞争;
- 实现透明操作,不被tracee的真实父进程察觉(如不触发shell作业控制)。
我尝试了两种方案,但均无法完全满足需求:
方案1:先追踪再停止
步骤如下:
- 借助
ptrace(2)附加到线程组领导者(线程ID等于进程ID); - 通过
tgkill(2)向该线程发送SIGSTOP; - 等待信号传递停止并注入
SIGSTOP; - 等待组停止(此时假设进程所有线程均已停止执行);
- 遍历
/proc/PID/task目录,附加到其余所有线程; - 通过
PTRACE_*请求恢复领导者线程。
问题:该方案会让tracee的真实父进程收到SIGSTOP通知,导致shell将目标进程转入后台,无法满足透明性要求。
方案2:先停止再追踪
当前采用的方案步骤:
- 向tracee的线程组领导者发送
SIGSTOP; - 用
PTRACE_SEIZE和PTRACE_INTERRUPT附加到领导者线程并停止它; - 附加到其余所有线程;
- 向领导者线程发送
SIGCONT。
问题:该方案在实验中未触发shell作业控制,但缺乏tracee与追踪器在停止状态的同步机制,且对信号和事件行为存疑,无法确认其可靠性。
内容的提问来源于stack exchange,提问作者kunht
相关产品推荐
相关产品推荐

