我正在尝试调试用在Android 5上运行的C编写的JNI代码。当我的一个函数被调用时,我想写一个堆栈跟踪到adb日志,这样我就可以看到函数的调用位置了。< / p>
我发现的第一个资源表明我需要使用libcorkscrew,并包含了如何使用该库的完整示例。不幸的是,似乎libcorkscrew已经从Android 5中消失了,现在应该使用libunwind。对于我的项目,有几个问题:
将libunwind引入项目的说明很少和/或误导 - 有些资源说从github下载项目并构建它(指示不起作用),其他人表示该库已经是Android的一部分5。
所有的例子都是用C ++编写的,似乎libunwind只对其中的函数有C ++绑定。由于我的代码是C,而不是C ++,并且写入日志函数而不是通过C ++ stdlib,因此无法使用。
除其他外,我查看了这些页面:
有没有办法在Android 5上的C代码中获取堆栈跟踪而不会导致程序崩溃?
答案 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命令行应用程序: