質問

私は定期的にさまざまなJavaクライアントでのスレッドのスタックトレースをプリントアウトすることを目的としている、(Cで)短くてシンプルなプロファイラを書いています。私は、侵入を最小限に抑え、関係なく、スレッド状態のスタックトレースを可能にする代わりにGetStackTraceのの文書化されていない機能AsyncGetCallTraceを使用する必要があります。関数のソースコードはここで見つけることができます:<のhref =「http://download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gz」のrel = "nofollowをnoreferrer"> http://download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gzする ホットスポット/ SRC /シェア/ VM /プリム/ forte.cpp。私はJVMTI、信号処理、およびタイミングを文書化するいくつかのmanページだけでなく、AsyncGetCallTraceコールを設定する方法の詳細とブログを見つけます。http:// jeremymanson.blogspot.com/2007/05/profiling-with-jvmtijvmpi- SIGPROF-and.htmlます。

何このブログが欠落していると、シグナルハンドラ内の関数呼び出し、実際にコードが(著者は読者が彼/彼女自身でこれを行うことができ前提とし)です。私は正確にこれを行うに助けを求めています。私は、上記のファイルforte.cppに定義されているように、必ずどこでどのように構造体ASGCT_CallTrace(および内部構造体ASGCT_CallFrame)を作成することはないです。 JNIEnvの*のenv_id、JINTのnum_framesとして、及びJVMPI_CallFrame のフレーム:構造体ASGCT_CallTraceは、パラメータの一つ、私はそれを作成する必要が行うので、AsyncGetCallTraceに渡されたが、私はそのフィールドの正しい値を取得する方法がわからないです。さらに、私は三番目のパラメータをすることになっているAsyncGetCallTrace(無効のucontext)に渡されたのか分からないのですか?

は、上記の問題は、私が午前主なものです。しかし、私が直面しています他の問題は、次のとおりです。 [1] SIGPROFは正確に指定した間隔でタイマーによって提起されているように見えるのではなく、少しそれほど頻繁にはありません。私はSIGPROFを毎秒(1秒、0マイクロ秒)を送信するようにタイマーを設定した場合であること、そして5秒の実行で、私は(通常は1-3)5つの未満のSIGPROFハンドラ出力を取得しています [2] SIGPROFハンドラ出力は、JavaコードでのThread.sleep中にまったく表示されません。だから、SIGPROFは毎秒送信される、と私はのThread.sleep(5000);,私は、コードの実行中に任意のハンドラの出力を得ることはありません。

を持っている場合

任意の助けいただければ幸いです。追加の詳細(ならびにコードとサンプル出力の一部)は、要求に応じて掲載される。

ありがとうございます。

役に立ちましたか?

解決

私は最終的に肯定的な結果を得ましたが、少し議論はここで生み出されたので、私自身の答えは簡潔になります。

ASGCT_CallTrace構造(及び下層のASGCT_CallFrameアレイ)は、単にこのようのみスタックを既存の、シグナルハンドラ内で宣言することができます。 ASGCT_CallTraceトレース。 JNIEnvの* ENV; global_VM_pointer-> AttachCurrentThread((無効**)&ENV、NULL); trace.env_id = ENV; trace.num_frames = 0; ASGCT_CallFrameストレージ[25]。 trace.frames =ストレージ

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

そして呼び出しはちょうど次のとおりです。 AsyncGetCallTrace(&トレース、25、&uContext);

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

他の二つの問題の場合: [1]スレッドが眠っているとSIGPROFが発生した場合、起床後にのみ信号スレッドハンドル。信号を処理するために、スレッドの仕事ですので、これは正常です。 [2]タイマーの不完全性はもう表示されていないようです。おそらく、私誤測定します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top