5

特定の子プロセスのデバッグが困難なマルチプロセス アプリケーションがあります。プロセス間のメッセージング タイムアウトが原因で、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());
    }
}
4

1 に答える 1

5

man function::raise(3stap) を参照してください。systemtap 2.3 (2013-07-25) で新しく追加されました。

stap -g -e 'probe WHATEVER { raise(%{ SIGSTOP %}) }'

スクリプトでこの関数を使用できるようにするには、グル モードが必要です。

于 2013-12-10T14:14:49.017 に答える