23

Android で C++ コードベースを実行しており、ユーザーからクラッシュ レポートを送信してもらいたいと考えています。

Java コードで問題なく動作するACRA ライブラリを使用していますが、ネイティブ コードで何かがクラッシュすると、十分な情報が得られません。実際には、ネイティブ関数呼び出しのスタック トレースを取得したいと考えています。プロセスが終了した後にクラッシュ情報が 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

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

4

2 に答える 2

8

私はゲームベースプロジェクトでこれを行いました-これを処理するJNIコードをここで見ることができます:

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

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

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

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

于 2011-11-24T14:15:53.330 に答える
1

ACRA は、アプリケーションのクラッシュをトラップできます。次に、logcat (この質問を参照) コマンドを実行する 2 番目のプロセスをインスタンス化し、アプリケーション名でフィルタリングしてから、ダンプされたファイルを送信するプロセスを作成できます。以下の理由により、これは最適とは言えません。

  • logcat にまたがるアプリケーションには、WRITE_EXTERNAL_STORAGE および READ_LOGS 権限が必要です。
  • おそらく、ユーザーは新しいプログラムをインストールしなければならないことにイライラするでしょう。

しかし、これを行う別の方法は見つかりませんでした。

于 2011-11-24T12:29:57.177 に答える