【问题标题】:Print C stack trace on Android 5/Lollipop在 Android 5/Lollipop 上打印 C 堆栈跟踪
【发布时间】:2016-03-16 19:44:15
【问题描述】:

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

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

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

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

除其他外,我查看了以下页面:

  1. Native Stack Traces on Android Lollipop with libunwind

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

  3. Android NDK: getting the backtrace

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

【问题讨论】:

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


    【解决方案1】:

    将 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

    【讨论】:

      【解决方案2】:

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

      void *array[100];
      size_t size;
      
      size = backtrace (array, 100);
      backtrace_symbols_fd (array, size, STDOUT_FILENO);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-03
        • 2010-09-08
        • 2010-09-23
        • 2015-07-27
        • 2020-07-25
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多