【问题标题】:ptrace and threadsptrace 和线程
【发布时间】:2011-11-09 12:58:20
【问题描述】:

我正在开发一个包含 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(PTRACE_SETOPTIONS...。当然,我在事件处理后继续使用SIGCONT 完成任务。

【问题讨论】:

  • 我想我已经更接近问题的核心了:创建新线程时,我什至在观察过程中都没有收到 sigstop。但是,在 ptrace 文档中它说:“自动开始跟踪新克隆的进程,它将以 SIGSTOP 开始。”怎么会这样?
  • 我已经使用 procfs 和一个使用 posix 线程的小应用程序做了一些进一步的调查。应用程序所做的只是启动一个新线程并休眠一段时间。新线程也休眠了几秒钟。正如我所说,对于新线程,我不会收到带有 waitpid 的 sigstop。但是新线程的 procfs 中的状态文件告诉我: 名称:thread_test 状态:t(跟踪停止) Tgid:2538 Pid:2545 PPid:2395 TracerPid:2540 所以新线程已停止但 waitpid 没有收到停止信号.追踪线程的正确方法是什么?

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


【解决方案1】:

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

waitpid(-1, &status, __WALL)

而不是

waitpid(-1, &status, 0)

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多