27

ログ ファイルには、次の情報が含まれています。

[2012-09-24 00:09:32.590 +0000UTC] ERROR host server1 [] [] somepackage.someclass [] [Unknown] [V3rAqPaDvvAAAAExEXhdWGyh] [pjsQwTGHzxcAAAE5j4YdGvWV] "ThreadName"  Some error happened:  java.lang.ArrayIndexOutOfBoundsException: null

この 1 行だけで、例外スタック トレースはありません。

このtry例外が発生するブロックは、javassist を使用して作成された動的に生成された Java バイトコードを実行しています。

私は2つのことについて疑問に思っています:

  1. The java.lang.ArrayIndexOutOfBoundsException: null
  2. logger.error("message", theException)ブロック内で使用してログ フックを呼び出したにもかかわらず、スタック トレースが欠落しているcatchため、通常は完全なスタック トレースがログ ファイルに出力されます。

私の質問:

  1. ログ出力「java.lang.ArrayIndexOutOfBoundsException: null」を引き起こす可能性のあるコードの種類は何ですか? これをテストプログラムで再現しようとしましたが、うまくいきませんでした。私はいつも "java.lang.ArrayIndexOutOfBoundsException: Index: 3" のようなものを取得します。

  2. スタック トレースが欠落している理由は、このコードが実行時に動的に生成され、ロガー/JVM がスタック トレースまたは関連する行番号を「認識」していないためでしょうか?

私たちは現在、より多くの情報を得るためにデバッグと調査を行っていますが、おそらくこれは誰かにとって馴染みのあるものです.

4

2 に答える 2

33
  1. String参照と連結すると、null次のようなメッセージが表示される場合があります。

    Object obj = null;
    throw new ArrayIndexOutOfBoundsException("" + obj);
    
  2. Oracle JVM を使用している場合は-XX:-OmitStackTraceInFastThrow、追加のパラメーターとして追加して、それが役立つかどうかを確認することができます。一部の基本的な例外については、JVM はしばらくしてから同じ例外インスタンスを再利用します。この場合、スタック トレースはもうありません。このオプションは再利用を防ぐため、常にスタック トレースを取得します。

編集注: この最後は、OpenJDK の最近のバージョン (1.8 など) にも適用される可能性があります。

于 2012-09-25T12:02:57.210 に答える