【发布时间】: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