在使用pid附加pthread并操纵其调试寄存器的内容之后,等待使用waitpid(-1,& status,__ WAL);我希望能够阻止该线程并进行其他操作(定义另一个断点等)。
当我尝试使用kill()发送信号并等待线程为其他ptrace请求做好准备时,对于一个目标线程,它工作正常。另一方面,当跟踪线程数增加时,我陷入了waitpid()调用状态,并且永远不会被解除阻塞。
是否有一种安全,快速的机制来阻止正在运行的附加线程进行其他修改?
欢呼声。
答案 0 :(得分:0)
向线程发送信号时,请勿使用pid
。向进程发送信号(这是你正在做的事情)将它发送到该进程中的一些随机线程,这几乎肯定不是你想要做的。发送线程信号的工具是ptrhread_kill
。
这就是事情变得多毛的地方。 ptrace
接口使用“线程ID”(或tid
)。它们在与进程ID相同的上下文中构成,即 - 整数。另一方面,pthread_kill
使用pthread_t
类型,这是一种不透明的类型,并且不是一回事。
由于使用ptrace
意味着你已经处于黑暗魔法之地,最简单的解决方案是使用tgkill
。只需将tid
和pid
放在相关字段中,就可以了。
当然,tgkill
不是导出的函数。您需要将其包装在syscall
中才能调用它。