特定の子プロセスのデバッグが困難なマルチプロセス アプリケーションがあります。プロセス間のメッセージング タイムアウトが原因で、gdb をターゲットの子プロセスにアタッチする時間がないため、systemtap プローブを介してプロセスを停止できるかどうか疑問に思っていました。
単純なプローブが必要になるはずです。たとえば、次のようになります。
probe process("exeName").mark("STOP_HERE")
{
force_sig(SIGSTOP, current);
}
残念ながら、上記はコンパイルされていません...何かアイデアはありますか?
私は systemtap の専門家ではないので、これはおそらく最善の解決策ではありませんが、興味のある人のための私の大まかな解決策は次のとおりです。
#!/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());
}
}