私たちは、特定の子プロセスのデバッグが困難であると判明しているマルチプロセスアプリケーションを持っています。プロセス間のメッセージタイムアウトのため、私たちはターゲットの子にgdbを添付する時間がないので、私はsystemtapプローブ経由でプロセスを停止できるかどうか疑問に思っていましたか?システムタブプローブでプロセスを停止してgdbを接続することはできますか?
シンプルなプローブすべきで、私が思うに、必要なこと、例えば:
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());
}
}
あなたのプロセスを1つの子プロセスで開始することをお勧めします。 1つの子を複数作成してから、それらを止めるハンドラを書くのではなく、簡単に始めることができます。 –
Rachit Jain;提案に感謝しますが、それは残念なことにオプションではありません。私が興味のあるものを試してみるかもしれないもう1つの方法はlldbです。これは起動してgdbよりもはるかに素早くアタッチできます(しかし私はfcheのmoの答えに固執しています)。 – mrtimdog