0

私が作成した jvmti エージェントを使用している Java アプリケーションをデバッグしたいと考えています。これは、jvmti エージェントが「can_generate_breakpoint_events」機能を有効にしようとしていない場合にのみ機能するようです。

ブレークポイント機能を有効にしてアプリをデバッグ モードで起動しようとすると、次のエラーが発生します。

ERROR: JVMTI: 98(Unknown): Unable to get necessary JVMTI capabilities. [..\src\agent.cpp:437]

ブレークポイントも設定する jvmti エージェントを使用しているアプリケーションをデバッグする方法はありますか?

Java JVMTIが-Xdebug -Xrunjdwpと一緒に機能しないことを確認しましたが、有効な機能にも依存しているように見えるため、受け入れられた答えは正しくないようです。

プロファイラー (YourKit など) も jvmti エージェントを使用しており、アプリをデバッグ モードで実行できることを知っています (これらの競合につながる機能を使用していないだけかもしれません)。

4

2 に答える 2

2

TL;DR

JVM エージェントをデバッグするには、gdb などのネイティブ コード デバッガーを使用します。

もう少し詳しく

Java アプリケーションには、Java コード (アプリケーション自体と java.lang.instrument ベースのエージェント) とネイティブ コード (Java クラスのネイティブ メソッド、JVMTI エージェント、および VM 自体) の 2 種類のコードがあります。前者をデバッグするには、Java デバッガ (JDWP を使用) を使用する必要があります。後者をデバッグするには、C/C++ プログラムの場合と同様に、通常のネイティブ コード デバッガーを使用する必要があります。Java とネイティブ コードの両方を同時にデバッグする場合は、両方のデバッガを使用する必要があります。

JVMTI エージェント、JDWP、および必要なものについて

JVM は複数のエージェントを同時に実行して開始することができ、各エージェントには独自の JVMTI 環境 (機能、イベント リスナーなど) があります。ただし、複数のエージェント (または単一のエージェントの複数のインスタンス) が同じリソース (たとえば、同じグローバル変数) を使用する場合、それらは互いに影響を与える可能性があります (これは JDK の JDWP エージェントの場合です - そのため、多くても 1 つのリソースを持つことができます)。-agentlib:jdwp)。

JDWP は、Java デバッガー用のプロトコルです。JDWP エージェントは、JVM での JDWP プロトコルのサポートを可能にする JDK に同梱されている JVMTI エージェントです。これは通常の JVMTI エージェントであり、他のエージェントと一緒に開始できます。

于 2016-10-26T22:13:07.397 に答える
0

私の現在の理解に基づいて、答えは実際には次のとおりです。JVMTI ドキュメントから:

各 JVMTI 実装で潜在的に利用可能な機能は異なります。実装に応じて、機能:

  • ...
  • 一度に 1 つの環境だけが所有できる
  • ...

ブレークポイントとウォッチポイントの設定は、1 つの環境でのみ所有できるタイプの機能のようです。

問題は、エージェントが can_generate_breakpoint 機能を要求しようとしているのに、デバッガ エージェントもそれらを必要とすることです。したがって、上記のエラーにつながるこれらの機能を要求する 2 つのエージェントがあります。

結果として、これは、ブレークポイントを設定できる必要がある JVM TI エージェントで開始された Java アプリケーションをデバッグできないことを意味します。

私が考えることができる唯一の理論的な解決策は、私の JVM TI エージェントが追加で JDWP のサポートを実装し、デバッガーがそれに接続できるようにすることです (それ自体がかなりのプロジェクトになると思います)。

于 2016-11-24T23:05:29.467 に答える