Android NDK里C/C++堆栈错误

本文介绍了一种通过使用Android Studio的adb和ndk-stack命令来分析so文件中的堆栈信息的方法,帮助开发者快速定位NDK中的错误,并给出了具体的命令及错误信息示例。

NDK中如果发生错误,从logcat里很难直观的看出问题出在哪里.比如经常是像下面这样的错误信息:

2020-12-22 13:53:33.208 26890-26914/com.sy.hap_android_sdk A/libc: Fatal signal 8 (SIGFPE), code 1, fault addr 0x8b09ad32 in tid 26914 (pool-1-thread-1)

面对这样的错误信息,完全不知道是C/C++代码里的什么问题导致安卓应用发生问题.

不过android studio提供了adb和ndk-stack命令,可以帮助分析so文件里的堆栈信息,并明确告诉bug发生的具体地方,精确到了方法.

 

1.将SDK的相关命令加入到windows的环境变量中

比如我的本机上将如下两个文件夹目录加入到了path路径

$Android\Sdk\platform-tools

$Android\Sdk\ndk\21.3.6528147

2.分析并显示堆栈错误信息

采用如下命令

adb logcat | ndk-stack -sym $app路径\build\intermediates\cmake\debug\obj\armeabi-v7a\

显示错误信息如下(红框中即为c代码中bug产生的方法)

Android Studio 中使用 `ndk-build` 调试 C++ 堆栈跟踪需要结合 NDK 提供的工具链和调试符号信息。以下是一个完整的流程,帮助开发者查看和分析 C++堆栈信息。 ### 配置构建环境以包含调试信息 确保在构建原生代码时保留了调试信息。这通常通过在 `build.gradle` 文件中配置 `externalNativeBuild` 来实现: ```gradle android { ... defaultConfig { ... externalNativeBuild { cmake { arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_CPP_FEATURES=rtti exceptions" } } } ... externalNativeBuild { cmake { path "CMakeLists.txt" version "3.22.1" // 使用适合你项目的版本 } } } ``` 上述配置确保了在构建过程中启用 RTTI 和异常处理,并且这些特性对堆栈跟踪非常关键[^2]。 ### 使用 ndk-build 构建原生库 如果你没有使用 CMake,而是直接使用 `ndk-build`,请确保你的 `Android.mk` 文件正确地指定了构建参数。为了保留调试信息,可以在 `LOCAL_CFLAGS` 中添加 `-g` 标志: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := native-lib LOCAL_SRC_FILES := native-lib.cpp LOCAL_CFLAGS += -g # 保留调试信息 include $(BUILD_SHARED_LIBRARY) ``` 然后,在终端中运行 `ndk-build` 命令来构建项目: ```bash cd app/src/main/jni ~/Library/Android/ndk/ndk-build ``` 这个命令会生成带有调试信息的 `.so` 文件[^1]。 ### 检查 .so 文件中的调试信息 你可以使用 `llvm-readelf` 工具检查 `.so` 文件是否包含调试信息: ```bash $NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf -S /path/to/libXxx.so ``` 如果输出中包含 `.debug_info`、`.debug_line` 等节区,则表示该文件包含了调试信息[^3]。 ### 在 Android Studio 中调试 C++ 堆栈跟踪 为了在调试器中看到 C++ 堆栈跟踪,请确保以下几点: - **启用 Native 调试**:在 Android Studio 的 Run/Debug 配置中,确保启用了 Native 调试选项。 - **设置断点**:在 C++ 代码中设置断点,启动调试会话后,程序会在断点处暂停。 - **查看调用堆栈**:当程序暂停时,Android Studio 的 Debug 窗口会显示当前的调用堆栈,包括 Java 和 C++堆栈信息。 ### 使用 LLDB 进行更高级的调试 LLDB 是 Android Studio 内置的调试器,支持强大的原生调试功能。你可以通过 LLDB 控制台执行命令,例如打印堆栈跟踪: ```lldb bt ``` 该命令会打印出当前线程的完整堆栈跟踪。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值