ptrace和线程

时间:2011-09-02 23:03:21

标签: linux multithreading linux-kernel system-calls ptrace

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

  • SIGSTOP构成子流程
  • 来自父母的
  • SIGTRAP

要跟踪我使用PTRACE_O_TRACEFORKPTRACE_O_TRACEVFORKPTRACE_O_TRACECLONEPTRACE_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_SETOPTIONS...报告的每个新任务调用ptrace。当然,我在事件处理后继续SIGCONT的任务。

1 个答案:

答案 0 :(得分:13)

最后,我自己找到了解决方案:我通过调用

从所有线程获得了信号
waitpid(-1, &status, __WALL)

而不是

waitpid(-1, &status, 0)