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

时间:2015-12-11 00:34:05

标签: android c java-native-interface printstacktrace libunwind

我正在尝试调试用在Android 5上运行的C编写的JNI代码。当我的一个函数被调用时,我想写一个堆栈跟踪到adb日志,这样我就可以看到函数的调用位置了。< / p>

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

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

  2. 所有的例子都是用C ++编写的,似乎libunwind只对其中的函数有C ++绑定。由于我的代码是C,而不是C ++,并且写入日志函数而不是通过C ++ stdlib,因此无法使用。

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

    1. Native Stack Traces on Android Lollipop with libunwind

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

    3. Android NDK: getting the backtrace

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

2 个答案:

答案 0 :(得分:0)

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

void *array[100];
size_t size;

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

答案 1 :(得分: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绑定。

以下是纯C中使用libunwind的示例Android命令行应用程序:

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