1

Eclipseでは、例外がスローされたときにアプリケーションの状態をデバッグできるように、例外のブレークポイントに設定されたオプションがあります。

ケース1

この最初の例では、すべてがうまく機能しています。完全なコールスタックが表示され、コールスタックの任意のレベルをクリックして、クラッシュ時のローカル変数を確認できます。

ここに画像の説明を入力してください


ケース2

ただし、コードの他の部分(UIスレッドまたはGLSurfaceViewスレッドのように見えるもの)で例外が発生した場合、まったく役に立たない動作が発生します。強制終了後、logcatで例外を確認できます。

05-30 20:18:10.905: E/AndroidRuntime(23982): FATAL EXCEPTION: GLThread 13
05-30 20:18:10.905: E/AndroidRuntime(23982): java.lang.NullPointerException
05-30 20:18:10.905: E/AndroidRuntime(23982):    at x.x.x.Graphics.MyRenderer.drawSubRenderable(MyRenderer.java:237)
05-30 20:18:10.905: E/AndroidRuntime(23982):    at x.x.x.Graphics.MyRenderer.onDrawFrame(MyRenderer.java:181)
05-30 20:18:10.905: E/AndroidRuntime(23982):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1363)
05-30 20:18:10.905: E/AndroidRuntime(23982):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)



しかし、クラッシュ時にアプリケーションを停止することはできません。アプリケーションは停止しますが、これしか取得できません(呼び出しスタックに自分のコードが表示されません):

ここに画像の説明を入力してください



ケース3

最後に、UIスレッドで例外をスローすると、このモンスターが発生しますが、例外をスローしたコードはどこにも表示されません。

ここに画像の説明を入力してください

質問

例外がスローされる理由を調べることができるように、すべての場合に実際のコードのブレークポイントにコードを取得できないのはなぜですか?なぜそれが機能する場合と機能しない場合があるのですか?Androidソースをインストールした場合、役に立ちますか?(現在、例外が発生したときに「ソースが見つかりません」というメッセージが表示されるだけです)

4

1 に答える 1

0

それでもう少し調べてみたら、何が起こっているのか推測できると思います。

私は現在、キャッチされていない例外のみをキャッチしていました。Androidコールバック内で発生した例外はすべて処理されて再スローされるため、アクティブなスタックトレースからソースが削除されると思います。

キャッチされたすべての例外をキャッチすると、すべての場合よりも、自分のコードが必要に応じてコールスタックに見つかります。

残念ながら、キャッチされたすべての例外をキャッチすると、Androidフレームワークで内部的に生成および処理された100を超える例外をブレークするため、キャッチされた例外をキャッチすることはやや役に立たなくなります。

ここにもっと良い解決策があったらいいのにと思います。何か知っているなら答えてください!

于 2012-05-31T07:03:16.863 に答える