15

我正在开发一个包含 ptrace 的 linux 应用程序来观察另一个进程的线程。当我观察到的应用程序派生一个子进程时,这已经很好地工作了。通过在我的应用程序中调用 waitpid,我可以在观察应用程序中获得以下信号:

  • SIGSTOP形成子进程
  • SIGTRAP来自父母

为了跟踪所有孩子,我使用PTRACE_O_TRACEFORK、和.PTRACE_O_TRACEVFORKPTRACE_O_TRACECLONEPTRACE_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...ptraceSIGCONT

4

1 回答 1

15

最后,我自己找到了解决方案:我通过调用从所有线程中获取了信号

waitpid(-1, &status, __WALL)

代替

waitpid(-1, &status, 0)
于 2011-09-03T13:54:09.783 回答