我正在开发一个包含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_SETOPTIONS...
报告的每个新任务调用ptrace
。当然,我在事件处理后继续SIGCONT
的任务。
答案 0 :(得分:13)
最后,我自己找到了解决方案:我通过调用
从所有线程获得了信号waitpid(-1, &status, __WALL)
而不是
waitpid(-1, &status, 0)