我正在编写一个主要针对 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 开始,一个线程可以并且默认情况下会等待同一线程组中其他线程的子线程。
所以最多这是一个 ptrace 限制。