我们有一个多进程应用程序,其中debugging特定的subprocesscertificate是困难的。 由于进程之间的消息超时,我们没有时间将gdb附加到目标孩子,所以我想知道是否可以通过systemtap探针停止进程?
我认为应该做一个简单的调查,例如:
probe process("exeName").mark("STOP_HERE") { force_sig(SIGSTOP, current); }
不幸的是,上面没有编译…任何想法?
我不是一个systemtap专家,所以这可能不是最好的解决scheme,但是对于任何感兴趣的人来说,这是我的粗略解决scheme:
#!/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()); } }
请参见systemtap 2.3(2013-07-25)中的man function :: raise(3stap)。
stap -g -e 'probe WHATEVER { raise(%{ SIGSTOP %}) }'
你需要大师模式让脚本使用这个功能。