インストルメンテーションを使用して Java アプリケーションをデバッグしようとしていました。現在のシステムの問題点は、
- ログステートメントはほとんど書かれていません
- 貧弱な例外処理
これにより、壊れた機能の根本原因を追跡することが非常に困難になりました。
この状況に対処するために、API を使用してツール、Java エージェントを開発しましInstrumentation
た。ログ ステートメントを挿入することができ、問題の半分は解決されました。
しかし、次の問題は、例外を記録することです。アプリケーションの実行中に例外がスローされるたびに、ツール レコードを拡張したいと考えています。javaassist
メソッドの API を使って ( addCatch
、 、を使用しinsertBefore
て)、 try-catch ブロックを挿入してみましinsertAfter
たが、ある程度効果があります。
public byte[] transform(ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer)
throws IllegalClassFormatException {
if (className.startsWith("com/alu/")) {
return insertLog(className, classBeingRedefined, classfileBuffer);
}
if(className.endsWith("Exception")){
System.out.println("============= exception occured "+className);
}
ここで inserLog(..)
、メソッドは必要なログ ステートメントを挿入し、正常に動作しますが、例外が発生するとトランスフォーマーに到達しません。
しかし、問題は、一部のメソッドが内部で例外を処理することです (log/sysout がなくても)。
例えば:
try {
if(search.equals("Category")){
//do operation
}
} catch (Exception e) {
}
NullPointerException
このコードは、の値がnullのときに食べsearch
ます。この例外とアプリケーションが何か他の理由で失敗することはわかりません。
最終的に私が欲しいのは、アプリケーションによってスローされた例外を記録するメカニズムです。以下の詳細を取得する必要があります
- 例外の種類
- 例外スタックトレース
- メソッドとクラス名
API があることは知っていますThread.setDefaultUncaughtExceptionHandler
が、Java インストルメンテーションでどのように使用するかはわかりません。アプリケーションにアクセスするソースがありません。
【アップデート1】
以下のリンクを使用するようretransformation
に指示されていることがわかりました。試して更新します
どんなガイダンスも非常に役に立ちます。