本地代码 – 如何以编程方式获取函数调用堆栈(回溯)

我有Android上运行的C代码库,并希望有用户发送崩溃报告。

我正在使用适用于Java代码的ACRA库 ,但是当本机代码崩溃时,我得不到足够的信息。 其实我想接收本地函数调用的堆栈跟踪。 我知道崩溃信息打印到logcat后,我的过程结束,我可以configurationACRA读取/发送logcat。 我已经设置了我的代码,使用信号处理程序检测本机崩溃,并通过ACRAcallbackJava进行报告。 它工作也很好。

然而,这种方法的时机不好 – 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 

有什么办法从我的代码中得到这个堆栈跟踪?

Solutions Collecting From Web of "本地代码 – 如何以编程方式获取函数调用堆栈(回溯)"

我已经在我的游戏基础项目中做了这个 – 你可以在这里看到处理这个的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

整体解决scheme是基于处理信号,然后在信号处理程序发起一个调用Java到堆栈跟踪等转储,在我的代码中,我开始另一个活动获取logcat信息,并通过电子邮件发送给我。

ACRA可以捕捉应用程序崩溃。 然后,您可以实例化第二个执行logcat(请参阅此问题 )命令的进程,按应用程序名称进行筛选,然后让进程将转储的文件发送给您。 这远远不是最佳的,因为:

  • 将跨越logcat的应用程序必须具有WRITE_EXTERNAL_STORAGE和READ_LOGS权限
  • 用户很可能会因为不得不安装一个新程序而烦恼

但是我没有find另一种方法来做到这一点。