【发布时间】:2011-11-09 12:58:20
【问题描述】:
我正在开发一个包含 ptrace 的 linux 应用程序来观察另一个进程的线程。当我观察到的应用程序派生一个子进程时,这已经很好地工作了。通过在我的应用程序中调用 waitpid,我可以在观察应用程序中获得以下信号:
-
SIGSTOP形成子进程 -
SIGTRAP来自父母
为了跟踪所有孩子,我使用 PTRACE_O_TRACEFORK、PTRACE_O_TRACEVFORK、PTRACE_O_TRACECLONE 和 PTRACE_O_TRACEEXIT 设置了 ptrace。
虽然子进程一切正常,但我无法观察应用程序的线程。我从创建线程的进程中获得了SIGTRAP,但我没有从线程中获得任何信号。
线程和ptrace 有什么特别之处吗? strace 是如何跟踪线程的(我在strace 的代码中找不到线程专用的特殊例程)?
这就是我在应用程序中使用ptrace 的方式:
- 首先我附加到一个进程:
ptrace(PTRACE_ATTACH, pid, NULL, NULL); - 然后,我打电话给
waitpid():trace_pid = waitpid(-1, &status, 0); - 设置
ptrace选项:ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);
附加到 pid 后,我在循环中调用 waitpid() 并为 ptrace 报告的每个新任务调用 ptrace(PTRACE_SETOPTIONS...。当然,我在事件处理后继续使用SIGCONT 完成任务。
【问题讨论】:
-
我想我已经更接近问题的核心了:创建新线程时,我什至在观察过程中都没有收到 sigstop。但是,在 ptrace 文档中它说:“自动开始跟踪新克隆的进程,它将以 SIGSTOP 开始。”怎么会这样?
-
我已经使用 procfs 和一个使用 posix 线程的小应用程序做了一些进一步的调查。应用程序所做的只是启动一个新线程并休眠一段时间。新线程也休眠了几秒钟。正如我所说,对于新线程,我不会收到带有 waitpid 的 sigstop。但是新线程的 procfs 中的状态文件告诉我: 名称:thread_test 状态:t(跟踪停止) Tgid:2538 Pid:2545 PPid:2395 TracerPid:2540 所以新线程已停止但 waitpid 没有收到停止信号.追踪线程的正确方法是什么?
标签: linux multithreading linux-kernel system-calls ptrace