繁体   English   中英

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

[英]Print C stack trace on Android 5/Lollipop

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

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

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

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

其中,我查看了这些页面:

  1. 使用libunwind的Android Lollipop上的本机堆栈跟踪

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

  3. Android NDK:获得回溯

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

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

void *array[100];
size_t size;

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

将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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM