[英]Print C stack trace on Android 5/Lollipop
我正在尝试调试用在Android 5上运行的C编写的JNI代码。当我的一个函数被调用时,我想写一个堆栈跟踪到adb日志,这样我就可以看到函数的调用位置了。
我发现的第一个资源表明我需要使用libcorkscrew,并包含了如何使用该库的完整示例。 不幸的是,似乎libcorkscrew已经从Android 5中消失了,现在应该使用libunwind。 对于我的项目,有几个问题:
将libunwind引入项目的说明很少和/或误导 - 一些资源说从github下载项目并构建它(指示不起作用),其他人表示该库已经是Android 5的一部分。
所有的例子都是用C ++编写的,似乎libunwind只对其中的函数有C ++绑定。 由于我的代码是C,而不是C ++,并且写入日志函数而不是通过C ++ stdlib,这是不可用的。
其中,我查看了这些页面:
有没有办法在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命令行应用示例:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.