我有c++代码库运行在Android上,并希望有用户发送的崩溃报告。
我正在使用ACRA库,它可以很好地用于Java代码,但是当本机代码崩溃时,我没有得到足够的信息。实际上,我想接收本地函数调用的堆栈跟踪。我知道在我的进程结束后,崩溃信息被打印到logcat中,并且我可以配置ACRA来读取/发送logcat。我已经将代码设置为使用信号处理程序检测本机崩溃,并回调Java以由ACRA报告。
然而,这种方法的时机不好——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
有没有办法从我的代码得到这个堆栈跟踪?
我已经在我的游戏基础项目中这样做了-您可以在这里看到处理此操作的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信息并通过电子邮件发送给我。
ACRA可以捕获应用程序崩溃。然后,您可以实例化第二个进程,该进程将执行logcat(参见这个问题)命令,根据您的应用程序名称进行过滤,然后让该进程将转储文件发送给您。这远不是最优的,因为:
- 跨logcat的应用程序必须具有WRITE_EXTERNAL_STORAGE和READ_LOGS权限
- 可能用户会因为必须安装新程序而感到恼火