2013-12-10 4 views
5

私たちは、特定の子プロセスのデバッグが困難であると判明しているマルチプロセスアプリケーションを持っています。プロセス間のメッセージタイムアウトのため、私たちはターゲットの子に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()); 
    } 
} 
+0

あなたのプロセスを1つの子プロセスで開始することをお勧めします。 1つの子を複数作成してから、それらを止めるハンドラを書くのではなく、簡単に始めることができます。 –

+0

Rachit Jain;提案に感謝しますが、それは残念なことにオプションではありません。私が興味のあるものを試してみるかもしれないもう1つの方法はlldbです。これは起動してgdbよりもはるかに素早くアタッチできます(しかし私はfcheのmoの答えに固執しています)。 – mrtimdog

答えて

5

は男性機能を参照してください::昇給(3stap) 、システムタップ2.3(2013-07-25)の新機能

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

あなたは、あなたのスクリプトは、この機能を使用できるように教祖モードを必要としています。

+0

非常にありがとう、これはまさに私が後にしたものです。 set_task_state(...)を使ってスレッドごとにタスク状態を設定しようとしていましたが、実際にはうまくいかず私が何をしようとしているのかをカーネルに伝えてください。なぜ私がkill(...)の代替案を考えなかったか、つまりraise(...)!!ありがとう! – mrtimdog

+1

Doh!私はドキュメントの中でまっすぐ過去のレイズを読んでいました! ... "function :: raise - 現在のスレッドで信号を発生させる" – mrtimdog

関連する問題