本机代码-如何以编程方式获得函数调用堆栈(回溯)



我有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权限
  • 可能用户会因为必须安装新程序而感到恼火

相关内容

  • 没有找到相关文章

最新更新