【问题标题】:can you use multiple threads to ptrace an application?您可以使用多个线程来跟踪应用程序吗?
【发布时间】:2010-11-03 21:01:00
【问题描述】:

我正在编写一个主要针对 Linux 的面向 GUI 的调试器,但我计划将来移植到其他操作系统。因为 GUI 必须始终保持交互,所以我有几个线程处理不同的事情。

我主要有一个“调试事件”线程,它只是循环等待 waitpid 返回并将接收到的事件传递给其他线程。我这样做是因为 waitpid 没有超时,这使得它很难与其他事件循环集成并保持响应(waitpid 可以无限期挂起!)。

到目前为止,这种策略对于 Linux 构建非常有效。最近我一直在尝试让我的调试器线程感知(如在被调试应用程序中的线程中,而不是调试器本身)。

所以我设置了 ptrace 选项来跟踪克隆事件并查找将高 16 位设置为PTRACE_EVENT_CLONE 的状态。然后我使用PTRACE_GETEVENTMSG 来获取新线程的TID。这一切都在我的小型测试工具应用程序中运行良好。但是由于某种原因,当我将该代码放入我的实际调试器时它失败了。 (我得到一个“没有这样的过程”错误代码)

我想到的一件事是,Windows 有一条规则,即只有附加到应用程序的线程才能侦听调试事件。 Linux 的 ptrace 有类似的限制吗?如果是这样,为什么我的代码适用于其他调试事件?

编辑:

看起来,至少 waitpid 支持从不同的线程等待,手册页说:

在 Linux 2.4 之前,线程只是一个 过程的特殊情况,并作为 结果一个线程无法等待 另一个线程的孩子,即使当 后者属于同一个线程 团体。但是,POSIX 规定 这样的功能,并且从 Linux 2.4 a 线程可以,并且默认情况下 会,等待其他人的孩子 同一线程组中的线程。

所以至多这是一个 ptrace 限制。

【问题讨论】:

  • 有什么原因不能在 waitpid() 调用中使用 WNOHANG 吗?
  • 好吧,如果我这样做了,我必须在 CPU 峰值和事件之间的人为延迟之间做出选择。如果 waitpid 超时,我可以两全其美:-/。 (不幸的是,由于 Qt 将 SIGCHLD 用于自己的目的,因此 selfpipe 技巧也不可行)。
  • 更新:我已经找到了一种使用 Qt4 安全获取 SIGCHLD 信号的方法,所以我一直在使用 selfpipe 技巧,它允许我让 ptraces 调用都来自同一个进程.但是,我的问题仍然存在。 Linux有没有限制,只有附加的线程才能在目标进程上使用ptrace?

标签: linux multithreading debugging ptrace


【解决方案1】:

在实现Maxine VM debugger 的 Linux 特定部分时,我遇到了同样的问题(还有许多其他问题!)。您的猜测是正确的,调试器中只有一个线程可以使用 ptrace 来控制被调试者。我们通过在专用线程上对 ptrace 进行所有调用来实现这一点。您可能会发现查看 kenai.com/projects/maxine/sources/maxine/show 上的 Maxine 源中的 LinuxTask.java、linuxTask.h 和 linuxTask.c 文件很有用

【讨论】:

    【解决方案2】:

    据我所知,这是不允许的。一个任务不能在它没有附加的任务上使用ptrace。此外,一个任务最多可以由另一个任务跟踪,因此您不能简单地在每个线程中附加一次。我认为这是因为当一个任务附加到另一个任务时,跟踪任务成为被跟踪任务的父级,每个任务只能有一个父级。

    似乎应该允许多线程跟踪,因为线程是同一进程的一部分,但在实现方面,Linux 内核中的线程和进程之间实际上并没有太大区别。线程只是碰巧与另一个任务共享其大部分资源的任务。

    如果您有兴趣,可以浏览内核中的source code for ptrace。具体看ptrace_check_attach,大多数请求都由sys_ptrace调用。如果目标任务的父任务不是当前任务,它会返回-ESRCH(听起来像你得到的错误代码)。

    【讨论】:

    • 是的,这也是我的感受。有趣的是,wait 系列确实允许线程等待其他线程的子线程。所以看起来是可行的(只需使用类似的逻辑等待)。看起来 ptrace.c 中的第 94 行确实是罪魁祸首。谢谢!
    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多