2012-02-18 13 views
4

C言語のプログラムで関数内で費やされた時間を測定するDTraceスクリプトを作成しました。プログラム自体が実行され、データが出力されて終了します。短命のアプリケーションのトレースを外す

問題は、私がプロセスIDを取得してDTraceを開始する方法が完了したことです。

現時点では、自分のコードの中にsleep()ステートメントがあり、DTraceを起動するのに十分な時間があります。情報を取得するためにあなたのコードを変更しなければならないのは、Dtraceの目的をちょうど打ち負かすことです。

基本的には、DTraceがプロセスIDを表示してからスクリプトを実行するのを待つようにしています。

+0

私は専門家ではありませんが、 'dtruss'はあなたにとって役に立つかもしれません。 – arrowd

+0

@arrowdodger私が知る限り、dtrussはプロセスシステムコールの情報を表示することができます。基本的に問題は、私のプログラムがプロセスidを取得してDTraceを開始するために速く終わるということです。私はより明確にするために私の質問を修正しました。 – bing

+3

私は自分の質問に答えることができない奇妙な理由から、私はここにそれを掲示しています。解決策は非常に簡単です.DTraceスクリプトでpidプロバイダを "pid $ target"に変更し、コマンドラインから "dtrace -s myscript.d -c ./myProg myFuncToAnalyse"を使用します。 – bing

答えて

5

おそらくあなたはpidプロバイダを使用しています。この場合、プロセスが作成される前にこれらのプローブを有効にする方法はありません。これに対する通常の解決方法は、 "-c"オプションを指定してdtrace自体からプログラムを呼び出すことです。

何らかの理由で(他のプロセスによって設定された環境でプロセスを起動しなければならない)、もっと複雑なアプローチを試すことができます:proc ::: startまたはproc:プログラムが実際に起動したときにトレースするにはexec-successを使用し、stop()アクションを使用してその時点でプログラムを停止し、system()を使用してPIDプロバイダを使用する別のDTrace呼び出しを実行した後、プログラムを再度実行します。