android - 在 Android 5/Lollipop 上打印 C 堆栈跟踪

标签 android c java-native-interface printstacktrace libunwind

我正在尝试调试在 Android 5 上运行的用 C 编写的 JNI 代码。当我的一个函数被调用时,我想将堆栈跟踪写入 adb 日志,以便我可以看到函数是从哪里调用的。

我找到的第一个资源表明我需要使用 libcorkscrew,并包含有关如何使用该库的完整示例。不幸的是,libcorkscrew 似乎从 Android 5 中消失了,现在应该使用 libunwind。对于我的项目,有几个问题:

  1. 关于将 libunwind 加入项目的说明很少和/或具有误导性 - 一些资源说从 github 下载项目并构建它(指导无效),其他资源表明该库已经是 Android 的一部分5.

  2. 所有的示例都是用 C++ 编写的,而且 libunwind 似乎只对其中的函数进行了 C++ 绑定(bind)。由于我的代码是 C 而不是 C++,并且写入日志函数而不是通过 C++ stdlib,所以这是不可用的。

除其他外,我查看了这些页面:

  1. Native Stack Traces on Android Lollipop with libunwind

  2. There's no "libcorkscrew" in Android 5.0...

  3. Android NDK: getting the backtrace

有没有一种方法可以在 Android 5 的 C 代码中获取堆栈跟踪而不会使程序崩溃?

最佳答案

你能在 Android 上使用 backtrace_symbols_fd 吗?如果可以,您可以使用这个:

void *array[100];
size_t size;

size = backtrace (array, 100);
backtrace_symbols_fd (array, size, STDOUT_FILENO);

关于android - 在 Android 5/Lollipop 上打印 C 堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34214323/

相关文章:

java - Android:从 C++ 调用带有 byte[] 参数的 java 方法

java - C++中的JNI JVM无法使用分配的堆内存

Android CanvasWatchFaceService.Engine onDraw 绘制矢量xml

android - 用于构建 Android 应用程序的 Gwt

c - 关于将 -1 转换为 size_t 导致循环卡住

c - 如何最佳地复制函数

Android OrderedBroadcast 在发布版本中不起作用

android - 是否有 API 可以*更改* Firebase 远程配置值?

c - 从一个文件访问静态变量到另一个文件

android - 对 H264 NAL 流进行 fragment 整理(最初是 1722 avb 数据包)