2011-08-29 10 views
6

Javaスタックトレースに情報を追加する方法はありますか?Javaスタックトレースにユーザー指定の情報を追加

私はスクリプト言語用のインタープリタを開発しており、Javaのstacktraceにスクリプトコードの対応する行を表示したいと考えています。

java.lang.NullPointerException 
at package.IPF_Try.execute(IPF_Try.java:76) called in script.scr:155 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_If.execute(IPF_If.java:105) called in script.scr:130 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_Main.execute(IPF_Main.java:147) 
... 

またはこの:出力は次のようなものになります

java.lang.NullPointerException 
at package.IPF_Try.execute(IPF_Try.java:76) 
    --- called in script.scr:155 --- 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_If.execute(IPF_If.java:105) 
--- called in script.scr:130--- 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_Main.execute(IPF_Main.java:147) 
... 

これは、簡単にたくさんのデバッグなるだろうが、残念ながらGoogleはこれを達成するために何かを見つけることができませんでした。

私が考えることができる唯一の方法は、名前が必要な情報を含み、単にスタックトレースの次のメソッドを呼び出すメソッドで多くのクラスを動的に生成することでした - しかし、それは(permgen)メモリとCPUのサイクルは私に。

+0

興味深い質問です。 Javaコンパイラはファイル名と行番号を持つデバッグシンボルをバイトコードに入れます。私はあなたがバイトコードを使いこなせば、あなたのニーズに合わせてそれを微調整することができると思います。 JSPコンパイラはそういうことをしていますか? – Thilo

+0

@Thilo - はい - JSPはバイトコードにコンパイルされます(中間のJavaフォームを使用することもあります)。あなたは通常、サーバーの "作業中の"ディレクトリを突き抜けて、コンパイルされたクラスを見つけることができます。 – McDowell

+0

問題は、さまざまなスクリプトから呼び出されるため、私のメソッドのバイトコードを単純に混乱させることができないため、特定の情報を追加することができないということです。 しかし、メソッド名などに必要な情報を含むクラスを動的に作成することはできますが、パフォーマンスの影響が懸念されます。 – ChristophK

答えて

1

スクリプトをバイトコードに翻訳する場合は、SourceFileおよびLineNumber属性を使用してデバッグの詳細を指定できます。

私は実行時にコールスタックに情報を注入する仕組みに気づいていません。

+0

これはあまりにも悪いので、SourceFileとLinenumber-Attributesのリファレンスに感謝します。 結局のところ私はクラスを生成しなければならないかもしれませんが、ファイルごととライン番号ごとにクラスが必要なので、これは数千のダミークラスを生成することを意味します... – ChristophK

+0

@ChristophK、なぜ1行に1クラスが必要ですか?代わりにあなたのスクリプトでルーチン/セクションごとに1つのクラスを使用できますか? – jelford

+0

が動作するかもしれませんが、私は "ダミークラス"を作成することを少し実験しました。そして、数千人もの永久ジェネレーション空間を使い果たしているようです。 – ChristophK

関連する問題