首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >本机代码-如何以编程方式获取函数调用堆栈(backtrace)

本机代码-如何以编程方式获取函数调用堆栈(backtrace)
EN

Stack Overflow用户
提问于 2011-10-10 16:24:16
回答 2查看 6.6K关注 0票数 23

我有C++代码库在安卓上运行,并希望有崩溃报告由用户发送。

我使用的是ACRA library,它在Java代码中工作得很好,但是当一些东西在本机代码中崩溃时,我得不到足够的信息。实际上,我希望接收本机函数调用的堆栈跟踪。我知道在我的进程结束后,崩溃信息会打印到logcat中,我可以配置ACRA来读取/发送logcat。我将代码设置为使用信号处理程序检测本机崩溃,并回调Java以供ACRA报告。它也工作得很好。

然而,这种方法有一个糟糕的时机- ACRA在崩溃进程仍在运行时读取日志,Android (不知道确切地说是哪一部分)在崩溃进程完全结束后将崩溃报告写到logcat。因此,在使用ACRA时,我不会收到堆栈跟踪。

因此,我正在寻找一种方法,通过编程从C++代码中读取当前堆栈跟踪,并将此信息提供给ACRA (或者其他崩溃报告工具)。

我所需要的就是一些写给logcat的报告:

代码语言:javascript
运行
复制
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

有没有办法从我的代码中获取这个堆栈跟踪?

EN

回答 2

Stack Overflow用户

发布于 2011-11-24 22:15:53

我已经在我的游戏库项目中做到了这一点-你可以在这里看到处理这一点的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信息并通过电子邮件将其发送给我。

票数 8
EN

Stack Overflow用户

发布于 2011-11-24 20:29:57

ACRA可以捕获应用程序崩溃。然后,您可以实例化另一个进程,该进程将执行logcat (请参阅this question )命令,根据您的应用程序名称进行过滤,然后让该进程将转储的文件发送给您。这并不是最优的,因为:

对于将跨越logcat的应用程序,必须具有WRITE_EXTERNAL_STORAGE和READ_LOGS permissions

  • Probably用户将会对必须安装新程序

感到恼火

但我没有找到另一个替代方案来做这件事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7710151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档