私はプロジェクトに取り組んでおり、Javaアプリケーションのネイティブスタックを取得する必要があります。私はこれを部分的に達成することができます。ptrace/マルチプロセッシングとシグナルに感謝します。
Linuxでは、通常のJavaアプリケーションには最低14個のスレッドがあります。これらの14のうち、ネイティブスタックを取得する必要があるメインスレッドのみに関心があります。この目的を考慮して、メインスレッドのネイティブスタックを監視するfork()を使用して別のプロセスを開始しました。要するに、私には2つの別々のプロセスがあります。1つは監視されており、もう1つはptraceと信号処理を使用して監視を行います。
監視プロセスのステップ:
1)プロセスから他の14スレッドからメインスレッドIDを取得します。
2)ptrace_attach main_ID
3)ptrace_cont main_ID
連続ループ開始
{{
4)kill(main_ID、SIGSTOP)、
5)nanosleepと/ proc / [pid]/statディレクトリからのステータスの確認
6)スタックを読み取ってナビゲートするptrace_peekdata
7)ptrace_cont main_ID
8)nanosleepと/ proc / [pid]/statディレクトリからのステータスの確認
}
9)ptrace_detach main_ID
これにより、ネイティブスタック情報が継続的に完全に提供されます。しかし、時々私は1つの問題に直面します。
問題:
kill(main_ID、SIGSTOP)をメインスレッドに送信すると、プロセスの他のスレッドが終了または停止状態(T)になり、プロセス全体がブロックされます。これは一貫性のある動作ではなく、プロセス全体が正しく実行されます。メインスレッドに信号を送るだけなので、この動作を理解できませんでした。なぜ他のスレッドが影響を受けるのですか?誰かが問題の分析を手伝ってくれませんか?
また、プロセスのすべてのスレッドでCONTおよびSTOPシグナルを実行しようとしましたが、それでも問題が発生することがあります。
ありがとう、Sandeep