さまざまな 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
ます。AsyncGetCallTrace
JVMTI、シグナル処理、およびタイミングについて説明しているいくつかのマニュアル ページと、呼び出しの設定方法に関する詳細が記載されたブログを見つけました。 -and.html
このブログに欠けているのは、シグナル ハンドラー内で実際に関数を呼び出すコードです (著者は、読者が自分でこれを実行できると想定しています)。まさにこれを行うための助けを求めています。前述のファイルで定義されているように、 struct ASGCT_CallTrace
(および内部)を作成する方法と場所がわかりません。は に渡されるパラメータの 1 つなので、作成する必要がありますが、そのフィールドの正しい値を取得する方法がわかりません: 、、および。さらに、渡された 3 番目のパラメーターがどうあるべきかわかりませんか?struct ASGCT_CallFrame
forte.cpp
struct ASGCT_CallTrace
AsyncGetCallTrace
JNIEnv *env_id
jint num_frames
JVMPI_CallFrame *frames
AsyncGetCallTrace (void* ucontext)
上記の問題は、私が抱えている主なものです。ただし、私が直面している他の問題には次のものがあります。
SIGPROF
指定された間隔で正確にタイマーによって発生するようには見えませんが、少し頻度が低くなります。つまり、タイマーを毎秒 (1 秒、0 usec) 送信するように設定すると、5 秒の実行でハンドラー出力SIGPROF
が 5 つ未満になります (通常は 1 ~ 3)。SIGPROF
SIGPROF
Thread.sleep
ハンドラの出力は、Java コードの実行中にまったく表示されません。したがって、 aSIGPROF
が毎秒送信され、私が を持っているThread.sleep(5000);
場合、そのコードの実行中にハンドラー出力は取得されません。
どんな助けでも大歓迎です。追加の詳細 (およびコードとサンプル出力の一部) は、リクエストに応じて投稿されます。