osg*_*sgx 3 linux ptrace signals
我有一个名为"调试器"的应用程序hyper-ptrace.它开始user_appl3与NPTL多线程.
超级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
Run Code Online (Sandbox Code Playgroud)
每个线程以某个周期性间隔由硬件为user_appl3生成SIGTRAP,并将其传递给某个线程.间隔可以是100..1 ms甚至更短.它是一种带有中断的每CPU时钟.每个线程仅在其CPU上运行(以亲和力绑定).
所以有问题1:
如果thread1得到TRAP并且调试器进入do_some_analysis_of_the_child,(所以调试器没有wait3为第二个线程做一个),并且稍后一段时间thread2也会进行TRAP,那么Linux内核会做什么?
在我看来:thread1将被停止,因为它获得一个信号,并有一个等待调试器.但是thread2继续运行(是吗?).当thread2获得一个信号时,就没有一个等待的调试器,所以TRAP可以被传递给thread2本身,从而有效地杀死它.我对吗?
还有第二个问题,问题2:
对于这种情况,我应该如何重写 主循环的hyper-ptrace降低,通过提供信息给使用者的线程,在调试器的机会有多大?也没有陷阱生成硬件,用户应用程序也无法更改.停止第二个线程也不是一个变种.
我需要分析两个线程.有些部件只能在线程停止时完成.
提前致谢!
不,信号不会传递给应用程序.当信号发生时,子应用程序将停止,并且下次调用时将通知您的ptracing进程wait().
你是对的 - 跟踪停止仅适用于主线程.
要获得所需的行为,请在跟踪的线程停止后立即通过向SIGSTOP进程PID 发送一个暂停整个子进程(每个线程),并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 */
Run Code Online (Sandbox Code Playgroud)