我有C++代码库在安卓上运行,并希望有崩溃报告由用户发送。
我使用的是ACRA library,它在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
有没有办法从我的代码中获取这个堆栈跟踪?
发布于 2011-11-24 22:15:53
我已经在我的游戏库项目中做到了这一点-你可以在这里看到处理这一点的JNI代码:
https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/jni/NativeActivityJNI.cpp#cl-40
它调用下面定义的Java方法:
整体解决方案基于处理信号,然后在信号处理程序中触发对java的调用以转储堆栈跟踪等,在我的代码中,我启动另一个活动来获取logcat信息并通过电子邮件将其发送给我。
发布于 2011-11-24 20:29:57
ACRA可以捕获应用程序崩溃。然后,您可以实例化另一个进程,该进程将执行logcat (请参阅this question )命令,根据您的应用程序名称进行过滤,然后让该进程将转储的文件发送给您。这并不是最优的,因为:
对于将跨越logcat的应用程序,必须具有WRITE_EXTERNAL_STORAGE和READ_LOGS permissions
感到恼火
但我没有找到另一个替代方案来做这件事。
https://stackoverflow.com/questions/7710151
复制相似问题