【问题标题】:stopping an attached thread asynchrously using ptrace - linux使用 ptrace 异步停止附加线程 - linux
【发布时间】:2016-06-09 11:49:30
【问题描述】:
在使用其 pid 附加 pthread 并操作其调试寄存器的内容后,同时使用 waitpid(-1, &status, __WALL) 等待;我希望能够停止该线程并进行其他操作(定义另一个断点等)。
当我尝试使用 kill() 发送信号并等待线程为其他 ptrace 请求做好准备时,对于一个目标线程,它工作正常。另一方面,当跟踪的线程数量增加时,我被困在 waitpid() 调用中并且永远不会被解除阻塞。
是否有一种安全快速的机制来停止正在运行的附加线程以进行其他修改?
干杯。
【问题讨论】:
标签:
linux
multithreading
debugging
asynchronous
ptrace
【解决方案1】:
向线程发送信号时,不要使用pid。向进程发送信号(这就是您正在做的事情)将其发送到该进程中的某个随机线程,这几乎肯定不是您想要做的。发送线程信号的工具是ptrhread_kill。
这就是事情变得更加毛茸茸的地方。 ptrace 接口使用“线程 ID”(或 tid)。这些与进程 ID 在相同的上下文中构建,即 - 整数。另一方面,pthread_kill 使用 pthread_t 类型,这是一个不透明的,并且不是一回事。
因为使用ptrace 意味着你已经在黑暗魔法世界,最简单的解决方案是使用tgkill。只需将您的tid 和pid 放在相关字段中,就可以了。
当然,tgkill 不是导出函数。您需要将其包装在 syscall 中才能调用它。