gpt4 book ai didi

linux - 可以使用多个线程来跟踪应用程序吗?

转载 作者:IT王子 更新时间:2023-10-29 00:20:18 25 4
gpt4 key购买 nike

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

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

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

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

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

编辑:

似乎至少 waitpid 支持从不同的线程等待,手册页说:

Before Linux 2.4, a thread was just a special case of a process, and as a consequence one thread could not wait on the children of another thread, even when the latter belongs to the same thread group. However, POSIX prescribes such functionality, and since Linux 2.4 a thread can, and by default will, wait on children of other threads in the same thread group.

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

最佳答案

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

关于linux - 可以使用多个线程来跟踪应用程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1010520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com