4

我正在尝试调试在 Android 5 上运行的用 C 语言编写的 JNI 代码。当调用我的一个函数时,我想将堆栈跟踪写入 adb 日志,以便查看从何处调用该函数。

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

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

  2. 所有的示例都是用 C++ 编写的,而且似乎 libunwind 中的函数只有 C++ 绑定。由于我的代码是 C 而不是 C++,并且写入日志函数而不是通过 C++ 标准库,因此这是不可用的。

其中,我查看了以下页面:

  1. 带有 libunwind 的 Android Lollipop 上的本机堆栈跟踪

  2. Android 5.0 中没有“libcorkscrew”...

  3. Android NDK:获取回溯

有没有办法在 Android 5 上的 C 代码中获取堆栈跟踪而不会使程序崩溃?

4

2 回答 2

0

将 libunwind 加入项目的说明很少和/或具有误导性

编译后的 libunwind 包含在现代 Android NDK 中,例如 NDK r16b,位于sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libunwind.a. 您必须将此文件提供给链接器。您还需要下载匹配的标头,即libunwind.h__libunwind_config.h。对于 NDK r16b,可以在此处获取这些标头:https ://android.googlesource.com/platform/external/libunwind_llvm/+/ndk-r16/include/ 。

似乎 libunwind 只有 C++ 绑定

不,不是这样。大多数 libunwind 绑定都是 C 绑定。

这是一个使用 libunwind 的纯 C 语言示例 Android 命令行应用程序:

https://github.com/alexeikh/android-ndk-backtrace-test

于 2018-05-12T18:06:13.783 回答
0

你可以在 Android 上使用 backtrace_symbos_fd 吗?如果可以的话,你可以使用这个:

void *array[100];
size_t size;

size = backtrace (array, 100);
backtrace_symbols_fd (array, size, STDOUT_FILENO);
于 2017-05-24T15:33:15.540 回答