ABRT を使用した Java アプリケーションのデバッグ
ABRT の概要
ABRT はバグ自動報告ツールです。このツールはアプリケーションの不具合を検出し、Red Hat エンジニアが解析に利用できる情報を可能な限り収集して Red Hat に提出します。
ABRT を使用する理由
ABRT が作成するレポートには、問題報告時に回答が必要な情報が多数含まれるため、問題解決に必要な時間を大幅に減らすことができます。
ABRT Java サポート
ABRT は、取得できない Java の例外を簡単に報告する JVM エージェントを提供します。このエージェントは、取得できる例外と取得できない例外を報告することができますが、デフォルトでは取得できない例外のみを報告します。その例外は、systemd-journal、syslog、および標準ファイルに報告されます。
取得する情報の種類
ABRT は、システムに発生した例外と詳細情報など、パッケージに関する一般的な例外に加え、バックトレースを取得します。このバックトレースは、標準の Java スタックトレースの範囲を少し大きくしたもので、数種類の Java ランタイム情報をシステムプロパティから取得します。
- sun.java.command
- sun.java.launcher
- sun.boot.class.path
- sun.boot.library.path
- java.home
- java.class.path
- java.library.path
- java.ext.dirs
- java.endorsed.dirs
- java.vm.version
- java.vm.name
- java.vm.info
- java.vm.vendor
- java.vm.specification.name
- java.vm.specification.vendor
- java.vm.specification.version
パフォーマンスの影響に関する質問
エージェントは、取得できない例外も報告できるようにするために、数種類の JVMTI イベントコールバックを登録する必要があります。また、イベントコールバック内の処理が、アプリケーション全体のパフォーマンスに少し影響を及ぼします。
パフォーマンスの低下は、6% (最低) から 17% (最高) になる可能性があります。
Java に対して ABRT を有効にする方法
JVM エージェントは、ユーザーリクエストの Java によりロードされた動的ライブラリーとなります。したがって、ABRT JVM エージェントは下のようなライブラリーを提供し、ローカルのファイルシステムに保存します。
/var/lib64/libabrt-java-connector.so
Java がそのライブラリーをロードするには、java
コマンドに -agentpath 引数または -agentlib 引数を追加して実行する必要があります。-agentpath 引数ではエージェントライブラリーへの完全パスが使用でき、-agentlib 引数では $LD_LIBRARY_PATH で検索されるファイル名が使用できます。
ただし、この方法は、ABRT を有効にする点ではそれほど便利とは言えず、代わりに java-1.7.0-openjdk-headless
を利用できます。
バイナリーの java
はシェルスクリプトに置き換えられ、ABRT エージェントライブラリーが存在するかどうかを確認し、存在する場合はコマンドラインエージェントで以下を使用して Java を実行します。
-agentpath=/usr/lib64/libabrt-java-connector.so
ABRT JVM エージェントライブラリ-は abrt-java-connector パッケージが提供しているため、このパッケージをインストールすると、Java 例外を報告できるようになります。
$ yum install abrt-java-connector
ABRT Java エージェントを無効にする唯一の方法は、システムから abrt-java-connector パッケージを削除することです。
$ yum erase abrt-java-connector
/usr/share/doc/abrt-java-connector-$VERSION/README
ファイルの abrt-java-connector の詳細は、パッケージに同梱されています。
Comments