gpt4 book ai didi

linux - ptrace'ing 多线程应用程序

转载 作者:可可西里 更新时间:2023-11-01 11:50:51 27 4
gpt4 key购买 nike

我有一个类似“调试器”的应用程序,名为 hyper-ptrace。它启动使用 NPTL 的多线程 user_appl3

hyper-ptrace 的主循环是:

wait3(&status, FLAGS, &u);
// find a pid of child, which has a signal
switch (signal = WSTOPSIG(status))
{
case SIGTRAP:
do_some_analysis_of_the_child(pid, &status) // up to several ms
break;
}
ptrace(PTRACE_CONT, pid); // discard signal, user_appl3 doesn't know anything
//about this SIGTRAP

SIGTRAP 由硬件以某个周期性间隔为每个线程为 user_appl3 生成,并传递给某个线程。间隔可以是 100..1 毫秒甚至更短。它是一种带有中断的 per-CPU 时钟。每个线程仅在其 CPU 上运行(通过关联绑定(bind))。

于是就有了问题1:

如果线程 1 得到 TRAP 并且调试器进入 do_some_analysis_of_the_child,(因此调试器不会为第二个线程执行 wait3),并且稍后线程 2 也得到 TRAP, Linux内核会做什么?

在我看来:thread1 将被停止,因为它收到一个信号并且有一个等待调试器。但是 thread2 继续运行(是吗?)。当 thread2 收到信号时,将不会有等待的调试器,因此 TRAP 可以传递给 thread2 本身,从而有效地杀死它。 我说得对吗?

还有第二个问题,question2:

对于这种情况,我应该如何重写 hyper-ptrace 的主循环,以降低将信号传递给用户的机会线程,通过调试器?陷阱生成硬件和用户应用程序都不能更改。停止第二个线程也不是变体。

我需要分析这两个线程。一些 it 部分只有在线程停止时才能完成。

提前致谢!

最佳答案

不,信号没有传送到应用程序。子应用程序将在信号发生时停止,并且您的 ptracing 进程将在下次调用 wait() 时收到通知。

你是对的 - 跟踪停止只适用于主线程。

要获得您想要的行为,在跟踪线程停止后通过向进程 PID 发送 SIGSTOP 立即挂起整个子进程(每个线程),并使用 SIGCONT 恢复它 完成后:

wait3(&status, FLAGS, &u);

if (WIFSTOPPED(status))
kill(pid, SIGSTOP); /* Signal entire child process to stop */

switch (signal = WSTOPSIG(status))
{
case SIGTRAP:
do_some_analysis_of_the_child(pid, &status) // up to several ms
break;
}

ptrace(PTRACE_CONT, pid, 0, 0); // discard signal, user_appl3 doesn't know anything about this SIGTRAP
kill(pid, SIGCONT); /* Signal entire child process to resume */

关于linux - ptrace'ing 多线程应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3523708/

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