我们有一个多进程应用程序,调试特定的子进程很困难.由于进程之间的消息传递超时,我们没有时间将gdb附加到目标子进程,所以我想知道是否可以通过systemtap探测器停止进程?
我认为应该需要一个简单的探测,例如:
probe process("exeName").mark("STOP_HERE")
{
force_sig(SIGSTOP, current);
}
不幸的是,上面没有编译……任何想法?
我不是系统专家,所以这可能不是最好的解决方案,但这是我对任何感兴趣的人的粗略解决方案:
#!/bin/stap -g
global gdbRunning = 0;
probe process(@1).mark(@2)
{
raise(%{ SIGSTOP %});
gdbCmd = sprintf("cgdb -- -q -ex 'thread find %d' %s %d", tid(), @1, pid());
if (gdbRunning == 0)
{
gdbRunning = 1;
printf("STOP PID %d TID %d [%s]\n", pid(), tid(), gdbCmd);
system(gdbCmd);
}
else
{
printf("STOP PID %d TID %d\n", pid(), tid());
}
}
解决方法:
参见man function :: raise(3stap),new as systemtap 2.3(2013-07-25).
stap -g -e 'probe WHATEVER { raise(%{ SIGSTOP %}) }'
你需要guru模式让你的脚本使用这个功能.