既に展開されているアプリケーションからスタックトレースをエラーレポートとして取得する場合は、実際の変数値を取得して、例外がスローされる前の時点でシステムの状態を再構築すると便利です。ローカル変数の取得
Javaで実行可能なようなものは何ですか?そして、どうすればできますか?
乾杯、 マックス
既に展開されているアプリケーションからスタックトレースをエラーレポートとして取得する場合は、実際の変数値を取得して、例外がスローされる前の時点でシステムの状態を再構築すると便利です。ローカル変数の取得
Javaで実行可能なようなものは何ですか?そして、どうすればできますか?
乾杯、 マックス
あなたがそのようなEclipseとしてIDEを使用している場合 - あなたは、プログラムの実行全体を通じてこれを表示するデバッグツールを使用することができます。
唯一の方法は、問題のシステム状態が例外捕捉チェーンの上位にある変数か、例外オブジェクト自体(カスタム例外の場合)によって到達可能かどうかです。
public class MySpiffyException extends RuntimeException
{
final private int foo;
final private String bar;
public MySpiffyException(String message, int foo, String bar) {
super(message); this.foo = foo; this.bar = bar;
}
public MySpiffyException(Throwable cause, int foo, String bar) {
super(cause); this.foo = foo; this.bar = bar;
}
public int getFoo() { return this.foo; }
public String getBar() { return this.bar; }
}
...
public void someCode() {
...
int foo = ...;
String bar = ...;
if (foo > 0)
throw new MySpiffyException(foo, bar);
}
例外オブジェクトからどうやったら可能でしょうか? – Max
例外をスローしたコードが、参照または値をローカル変数に格納する例外タイプを使用した場合のみです。例えば、 –
。ほとんどの例外では起こりませんが、ローカル変数をキャッシュし、カスタムメソッドを使用してそれらにアクセスできるようにするカスタム例外を使用できない理由はありません。 –
私は(http://download.oracle.com/javase/6/docs/api/java/lang/StackTraceElement.htmlを参照)の出力のみが含まれるStackTraceElementのインスタンスから構築されていて、あなたが、クラス、ファイル、メソッドと行番号をスタックトレース内のローカル変数を取得することはできませんかなり確信しています。
あなたはそうです。 StackTraceElement自体はあまり役に立ちません。たぶん例外が発生したスレッドを取得してそこからローカル変数の値を取り出すことができるかもしれません... – Max
私は恐ろしいでしょう。例外をキャッチして元のスレッドを取得できれば、ソースメソッドから外れます。したがって、ローカル変数はもはや存在しません。私はそれがJVMレベルでフックを必要とするだろうと思う。 http://download.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.htmlを参考にしてください。 – gabuzo
はい、それはオプションですが、私はコードを一切覚えていない方がいいですが、必要なデータを得るためにVMに「話す」方法を見つけることが好きです。 – Max
は、このツールを見てください:
http://www.chrononsystems.com/
これは、アプリケーションのタイムラインで、時間に戻って行くためのオプションでスタックトレースを追跡することができます。私は自分でそれを試していないが、それはあなたが指している状況のタイプ(予期しない例外)を本当に有望に見える。
役に立ったとお伝えいただけますようお願いいたします。
これはそれです。 EclipseのリモートJavaアプリケーションとしてdepatchされたアプリケーション(コンテナはJPDA構成で開始する必要があります)をデバッグします。 – Alfabravo
悲しいことに、アプリケーションはスタックトレースを見るまでにすでに閉じられている可能性があります。 – Max