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

linux – 你可以使用多个线程来跟踪应用程序吗?,第1张

概述我正在编写一个面向GUI的调试器,主要针对 Linux,但我将来会计划到其他 *** 作系统的端口.因为GUI必须始终保持交互,所以我有几个线程处理不同的东西. 主要是我有一个“调试事件”线程,它只是循环等待waitpid返回并将接收到的事件传递给其他线程.我这样做是因为waitpid没有超时,这使得很难将它与其他事件循环集成并保持响应(waitpid可以无限期挂起!). 到目前为止,这种策略对于Linu 我正在编写一个面向GUI的调试器,主要针对 Linux,但我将来会计划到其他 *** 作系统的端口.因为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限制.

解决方法 据我所知,这是不允许的.任务不能在未附加的任务上使用ptrace.此外,任务最多可以由一个其他任务跟踪,因此您不能简单地在每个线程中附加一次.我认为这是因为当一个任务附加到另一个任务时,跟踪任务将成为跟踪任务的父级,并且每个任务只能有一个父级.

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

如果您有兴趣,可以在内核中浏览source code for ptrace.具体来看ptrace_check_attach,对于大多数请求,由sys_ptrace调用.如果目标任务的父项不是当前任务,它将返回-ESRCH(听起来像您正在获取的错误代码).

总结

以上是内存溢出为你收集整理的linux – 你可以使用多个线程来跟踪应用程序吗?全部内容,希望文章能够帮你解决linux – 你可以使用多个线程来跟踪应用程序吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1033063.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存