2011-10-10 14 views
23

私はC++コードベースをAndroid上で実行しており、ユーザーからのクラッシュレポートを送信したいと考えています。ネイティブコード - プログラムで関数呼び出しスタック(バックトレース)を取得する方法

私はACRA libraryを使用していますが、Javaコードでは問題なく動作しますが、ネイティブコードで何かクラッシュした場合、十分な情報が得られません。実際には、ネイティブ関数呼び出しのスタックトレースを受信したいと思います。プロセスが終了したらクラッシュ情報がlogcatに出力され、logcatを読み書きするようにACRAを設定できます。シグナルハンドラを使用してネイティブクラッシュを検出し、ACRAによるレポートのためにJavaにコールバックするコードをセットアップしました。それはまたうまくいく。

しかし、この方法ではタイミングが悪いです - クラッシュプロセスがまだ生きている間にACRAがログを読み込み、クラッシュしたプロセスが完全に終了した後にAndroidがクラッシュレポートをlogcatに書き込んでいます。だから私はACRAを使うときにスタックトレースを受け取らない。

C++コードから現在のスタックトレースをプログラムで読み込み、この情報をACRA(または他のクラッシュ報告ツール)にフィードする方法を探しています。

私に必要なのはlogcatに書かれたこの報告書のいくつかの種類である:

10-10 08:29:13.868: INFO/DEBUG(1121):   #00 pc 0003fc7c /data/data/com.ex.lib/libapp.so 
10-10 08:29:13.891: INFO/DEBUG(1121):   #04 pc 00016df4 /system/lib/libdvm.so 
10-10 08:29:13.891: INFO/DEBUG(1121):   #05 pc 00045284 /system/lib/libdvm.so 
10-10 08:29:13.899: INFO/DEBUG(1121):   #15 pc 00047c56 /system/lib/libdvm.so 
10-10 08:29:13.922: INFO/DEBUG(1121):   #16 pc 00030e4c /system/lib/libandroid_runtime.so 

が私のコードからこのスタックトレースを取得する方法はありますか?

答えて

1

ACRAがアプリケーションをクラッシュさせる可能性があります。その後、logcat(this questionを参照)コマンドを実行し、アプリケーション名でフィルタリングし、ダンプされたファイルをプロセスに送信する2番目のプロセスをインスタンス化することができます。これは、最適にはほど遠いので:

  • logcatは、おそらくユーザーは

しかし、新しいプログラムをインストールすることに悩まさだろうWRITE_EXTERNAL_STORAGEとREAD_LOGS権限

  • を持つ必要がまたがるう応用私はこれを行うための別の選択肢を見つけられませんでした。

  • +0

    あなたのapk内で定義された2番目のアクティビティになる可能性があります - 2番目のアプリをインストールする必要はありません –

    +0

    はい、これはREAD_LOGSが必要になり、ユーザに疑念を抱かせる可能性があります – scooterman

    8

    私は私のゲームのベースのプロジェクトでこれを行っている - あなたはここでこれを処理JNIコードを参照することができます

    https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/src/com/gmail/whittock/tom/Util/NativeActivity.java#cl-91

    :ここで定義されたJavaメソッドを呼び出します

    https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/jni/NativeActivityJNI.cpp#cl-40

    全体的な解決策は、信号を処理することに基づいています。そして、シグナルハンドラで、スタックトレースなどをダンプするjava呼び出しを起動するコードで、別のアクティビティを開始してlogcat情報を取得しますそれを私にメールしてください。

    +0

    シグナルハンドラ内でJavaメソッドを呼び出しますか? – Tapemaster

    関連する問題