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

 2023-01-17    423  

问题描述

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

我正在使用 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代码:

调用此处定义的Java方法:

其他推荐答案

ACRA可以捕获应用程序崩溃.然后,您可以实例化将执行logcat的第二个进程(请参见 this问题)命令,按您的应用程序名称进行过滤,然后有一个过程将转储文件发送给您.这远非最佳,因为:

  • 跨越logcat的应用程序必须具有write_external_storage和read_logs权限
  • 可能会使用户不得不安装新程序感到烦恼

,但我没有找到其他选择.

以上所述是小编给大家介绍的本地代码–如何以编程方式获得函数调用堆栈(回溯).,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25751.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。