使用ptrace - linux异步停止附加线程

时间:2016-06-09 11:49:31

标签: linux multithreading debugging asynchronous ptrace

在使用pid附加pthread并操纵其调试寄存器的内容之后,等待使用waitpid(-1,& status,__ WAL);我希望能够阻止该线程并进行其他操作(定义另一个断点等)。

当我尝试使用kill()发送信号并等待线程为其他ptrace请求做好准备时,对于一个目标线程,它工作正常。另一方面,当跟踪线程数增加时,我陷入了waitpid()调用状态,并且永远不会被解除阻塞。

是否有一种安全,快速的机制来阻止正在运行的附加线程进行其他修改?

欢呼声。

1 个答案:

答案 0 :(得分:0)

向线程发送信号时,请勿使用pid。向进程发送信号(这是你正在做的事情)将它发送到该进程中的一些随机线程,这几乎肯定不是你想要做的。发送线程信号的工具是ptrhread_kill

这就是事情变得多毛的地方。 ptrace接口使用“线程ID”(或tid)。它们在与进程ID相同的上下文中构成,即 - 整数。另一方面,pthread_kill使用pthread_t类型,这是一种不透明的类型,并且不是一回事。

由于使用ptrace意味着你已经处于黑暗魔法之地,最简单的解决方案是使用tgkill。只需将tidpid放在相关字段中,就可以了。

当然,tgkill不是导出的函数。您需要将其包装在syscall中才能调用它。