我正在开发一个包含 ptrace 的 linux 应用程序来观察另一个进程的线程。当我观察到的应用程序派生一个子进程时,这已经很好地工作了。通过在我的应用程序中调用 waitpid,我可以在观察应用程序中获得以下信号:
SIGSTOP
形成子进程SIGTRAP
来自父母
为了跟踪所有孩子,我使用PTRACE_O_TRACEFORK
、和.PTRACE_O_TRACEVFORK
PTRACE_O_TRACECLONE
PTRACE_O_TRACEEXIT
虽然子进程一切正常,但我无法观察应用程序的线程。我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_SETOPTIONS...
ptrace
SIGCONT