我正在开发一个linux应用程序,其中包含了ptrace来观察另一个进程的线程。当我观察到的应用程序分叉子进程时,这已经运行得很好了。通过在我的应用程序中调用waitpid,我可以在观察应用程序中获得以下信号:
SIGSTOP从父中形成子process
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 options:ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);在附加到pid之后,我在循环中调用waitpid(),并为ptrace报告的每一个新任务调用ptrace(PTRACE_SETOPTIONS...。当然,在事件处理之后,我继续使用SIGCONT执行任务。
发布于 2011-09-03 13:54:09
最后,我自己找到了解决方案:我通过调用从所有线程获得信号
waitpid(-1, &status, __WALL)而不是
waitpid(-1, &status, 0)https://stackoverflow.com/questions/7290018
复制相似问题