Java ME で例外スタック トレースのテキストを取得するにはどうすればよいですか?
質問
通常の Java では、PrintWriter を printStackTrace に渡すことでスタック トレースのテキストを取得できます。私はこれに対する答えを知っているような気がします(すなわち、「いいえ」)しかし、
JavaMEのスタックトレースのテキストを文字列として取得する方法はありますか?
アップデート:
CLDC 1.0 に制限されていることに注意してください。
解決
私の知る限り、特定のプラットフォームがデフォルトの System.err ストリームをオーバーライドする手段を提供しない限り、スタック トレースを文字列値として取得する方法はありません。BlackBerry プラットフォームでは、スタック トレースがスローされます。 catch(Exception)
メモリを節約するためですが、これは行われません catch(Throwable)
また、デバイス イベント ログを通じてスタック トレースにアクセスできるようになります。
私が最終的にやったことは、可能な限り最後の瞬間に例外ではなくThrowableをキャッチし、そこからスタックトレースを出力することです。もちろん、これにはあなたも巻き込まれる危険があります java.lang.Error
これはあまり良くありません、特に OutOfMemoryError
, 、への呼び出しですが、 System.gc()
印刷する前にスタック トレースを実行するとリスクが軽減されるようで、これに関して問題は発生していません。
私は、あなたがターゲットとしているプラットフォームを調べて、どこかで System.err にアクセスできるかどうかを確認します。デバッガはいつでも接続でき、コンソール出力に表示されるはずですが、「フィールドで」スタック トレースを取得しているように聞こえます。
他のヒント
2つのソリューション:
-
エミュレータで例外を再現します。ワイヤレスツールキットとNetbeansは、コンピューターにスタックトレースを出力します。
-
Symbianデバイスを使用します。
シリーズ60第3版のFeature Pack 2より前のSymbianハンドセットは、Sun Hotspot Java仮想マシンを使用します。 C標準ライブラリの部分的な実装にリンクすることにより、Symbian OSに適合しました。
これにより、Symbianはリダイレクタと呼ばれるC ++プログラムを作成でき、Java例外スタックトレースを含むVMの標準出力と標準エラーをキャプチャできました。
C ++リダイレクタは、Symbian OSのバージョン9では決してアップグレードされませんでした。代わりに、" redirect://" GCFプロトコルがVMに導入されました。
別のMIDletから、Connector.open(" redirect://&quot ;, Connector.READ)によって返された接続からInputStreamを開きます。その後、Symbian電話で例外スタックトレースをキャプチャできます。
編集:" redirect://" Series60 5th editionに戻って" redirect:// test" Series60 3rd edition feature pack 2で動作するはずです
CLDC 1.0でこれを行う方法はありません。ただし、一部のデバイス/ OSでは、基になるExceptionクラスがスタックトレースにアクセスする方法を提供している場合があります(新しいCLDCバージョンを考えてください)。リフレクションを使用して実行時に例外インスタンスを検査し、ターゲットプラットフォームでどのメンバーが公開されているかを確認します。その後、そのような情報を提供するプラットフォームでスタックトレースを安全に抽出できるコードを作成できます。
CLDCでも適切なスタックトレースを記録するために使用できるツールを作成しました。 http://jarrut.sourceforge.net で確認してください。それはまだ非常に新しく、いくつかのラフなエッジを持っているかもしれませんが、それは私のために機能し、それなしでMIDletを開発することはもう想像できませんでした。それを使用する最良の方法は、それをマイクロログと結合することです。
残念ながら、ツールには現在CLDC 1.1が必要であるため、元のポスターの問題を解決できない可能性があります。
PrintWriterでByteArrayOutputStreamに書き込み、バイトから文字列を再構築できます。
try{
throw new Exception("Message");
} catch (Exception ex){
ByteArrayOutputStream out = new ByteArrayOutputStream();
ex.printStackTrace(new PrintStream(out));
System.out.println(new String(out.toByteArray()));
}
見栄えはよくありませんが、どこでも動作するはずです。上記を試す前に、[Throwable#getStackTrace]( http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html#getStackTrace())、EclipseはCDC / Foundation 1.1で利用可能であると主張しているが、他のプロファイルについては何も言っていない。