4

さまざまな Java クライアントのスレッドのスタック トレースを定期的に出力することを目的とした、簡潔で単純なプロファイラー (C 言語) を作成しています。侵入を最小限に抑え、スレッドの状態に関係なくスタック トレースを可能にするAsyncGetCallTrace代わりに、文書化されていない関数を使用する必要があります。GetStackTrace関数のソース コードは、http: //download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gz にありhotspot/src/share/vm/prims/forte.cppます。AsyncGetCallTraceJVMTI、シグナル処理、およびタイミングについて説明しているいくつかのマニュアル ページと、呼び出しの設定方法に関する詳細が記載されたブログを見つけました。 -and.html

このブログに欠けているのは、シグナル ハンドラー内で実際に関数を呼び出すコードです (著者は、読者が自分でこれを実行できると想定しています)。まさにこれを行うための助けを求めています。前述のファイルで定義されているように、 struct ASGCT_CallTrace(および内部)を作成する方法と場所がわかりません。は に渡されるパラメータの 1 つなので、作成する必要がありますが、そのフィールドの正しい値を取得する方法がわかりません: 、、および。さらに、渡された 3 番目のパラメーターがどうあるべきかわかりませんか?struct ASGCT_CallFrameforte.cppstruct ASGCT_CallTraceAsyncGetCallTraceJNIEnv *env_idjint num_framesJVMPI_CallFrame *framesAsyncGetCallTrace (void* ucontext)

上記の問題は、私が抱えている主なものです。ただし、私が直面している他の問題には次のものがあります。

  1. SIGPROF指定された間隔で正確にタイマーによって発生するようには見えませんが、少し頻度が低くなります。つまり、タイマーを毎秒 (1 秒、0 usec) 送信するように設定すると、5 秒の実行でハンドラー出力SIGPROFが 5 つ未満になります (通常は 1 ~ 3)。SIGPROF

  2. SIGPROFThread.sleepハンドラの出力は、Java コードの実行中にまったく表示されません。したがって、 aSIGPROFが毎秒送信され、私が を持っているThread.sleep(5000);場合、そのコードの実行中にハンドラー出力は取得されません。

どんな助けでも大歓迎です。追加の詳細 (およびコードとサンプル出力の一部) は、リクエストに応じて投稿されます。

4

1 に答える 1

1

最終的に肯定的な結果が得られましたが、ここではほとんど議論が生まれなかったので、私自身の答えは簡単になります.

ASGCT_CallTrace 構造体 (および基礎となる ASGCT_CallFrame 配列) は、シグナル ハンドラーで簡単に宣言できるため、スタックのみが存在します。JNIEnv *env; global_VM_pointer->AttachCurrentThread((void **) &env, NULL); trace.env_id = env; trace.num_frames = 0; ASGCT_CallFrame ストレージ [25]; trace.frames = ストレージ;

以下は uContext を取得します。getcontext(&uContext);

そして、呼び出しは次のとおりです。 AsyncGetCallTrace(&trace, 25, &uContext);

このプロセスで注意しなければならないニュアンスが他にもあると思いますが、実際にはそれらを文書化しませんでした。私が持っている完全な現在のコードを開示できるかどうかはわかりません。このコードは、一定の間隔で任意の Java プログラムのスタック トレースを正常に非同期に要求し、取得します。でも、誰かが同じ問題に興味を持っていたり、行き詰まっていたりしたら、私は助けることができるようになりました (私はそう思います)。

他の 2 つの問題について: [1] スレッドがスリープ状態で SIGPROF が生成された場合、スレッドはそのシグナルをウェイクアップ後にのみ処理します。シグナルを処理するのはスレッドの仕事であるため、これは正常です。[2] タイマーの欠陥はもう現れないようです。測り間違えたのかな。

于 2010-08-10T19:53:11.560 に答える