Android NDK 调试和分析

Posted 码农乐园

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK 调试和分析相关的知识,希望对你有一定的参考价值。

简介

(初稿)
android NDK 开发中的高阶异常,属于其开发的Android平台知识更广泛的C++语言的开发工具。而NDK中的开发和异常是APP崩溃的需求。NDK因此,本文对 NDK 开发中常用的和进行总结,以比较能帮助大家提高 Android NDK 的开发水平。

首先,关于J NDK开发文章,请阅读NI并先认真完成以下的:

  • JNI官方文档

  • JNI Tips(Android官网JNI培训系列)

  • NDK入门指南,从Getting Started开始看,每一章都不要遗漏。

  • Android NDK的调试和分析主要有以下几种方法:

  1. LLDB:故障调试,断点和参数查看,用于开发者有源的情况下,多用于开发阶段;

  2. ndk-gdb:k-build脚本构建的,当前Android工作室默认已支持采用ndCMake方式构建工程,所以不是很推荐;

  3. ndk-stack:适用于发布版本,或者用户反馈问题(提供了错误的logcat日志)等情况,即直接分析NDK错误日志,分析C++源码的错误点。

  4. AddressSanitize:google官方提供的检测C/C++代码的内存错误的工具(除了Android,其他平台也可以使用)。

  5. Native Tracing:对C代码进行跟踪分析,比如执行时间和效率等。使用非常简单,只需要依赖Android的#include <android/trace.h>头文件即可。但仅在Android API Level>=23才支持。在开发阶段优化用于代码逻辑,提升质量算法等。

注:推荐采用LLDB或ndk-stack

LLDB

请参阅https://developer.android.com/studio/debug/

ndk-gdb

请参阅https://developer.android.com/ndk/guides/ndk-gdb

ndk 堆栈

请参阅https://developer.android.com/ndk/guides/ndk-stack

使用命令格式如下(其中,$NDK代表使用命令格式如下,新版Android studio的SDK安装目录,如果NDK安装在Android SDK下的ndk-bundle子目录中,如果是自己单独下载NDK的话,请找到NDK的压路。新版Android studio采用CMake制造,制造生成的so文件位于$PROJECT_PATH/app/build/intermediates/cmake/debug/obj/<abi>下(调试)或$PROJECT_PATH/app/build/intermediates/cmake/debug/release/<abi>(发布模式),<abi>表示您设备的ABI)。当然也可以直接从Android APK提取共享库的so文件,然后在指定模式下解开,为了分析。

亚行日志猫 | $NDK/ndk-stack -sym $PROJECT_PATH/app/build/intermediates/cmake/debug/obj/<abi>

或者单独执行:

adb logcat > /tmp/foo.txt
$NDK/ndk-stack -sym $PROJECT_PATH/app/build/intermediates/cmake/debug/obj/<abi> -dump foo.txt

示例(以窗口为例):

cd F:\\ubuntu\\share\\V8Android\\app\\build\\intermediates\\cmake\\debug\\obj\\arm64-v8a
“F:\\Android\\sdk\\ndk-bundle\\ndk-stack.cmd” -sym . -dump D:\\UserProfiles\\CoulsonChen\\Desktop\\ndk.txt >analyze.txt

analyze.txt 的内容代码如下(可以在明显看到错误的行哪里):

********** Crash dump: **********
Build fingerprint: 'google/walleye/walleye:8.1.0/OPM1.171019.019/4527419:user/release-keys'
pid: 6740, tid: 6740, name: boyaa.v8wrapper  >>> com.boyaa.v8wrapper <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x27
Stack frame         #00 pc 000000000056f204  /data/app/com.boyaa.v8wrapper-gc82kSUIyk_jPb6OjAZERw==/lib/arm64/libnative-lib.so: Routine v8::base::Relaxed_Load(long const volatile*) at /home/ibon/v8/v8/out.gn/aar_lkgr_64/../../src/base/atomicops_internals_portable.h:168
Stack frame         #01 pc 000000000056df00  /data/app/com.boyaa.v8wrapper-gc82kSUIyk_jPb6OjAZERw==/lib/arm64/libnative-lib.so: Routine v8::internal::(anonymous namespace)::InstantiateObject(v8::internal::Isolate*, v8::internal::Handle<v8::internal::ObjectTemplateInfo>, v8::internal::Handle<v8::internal::JSReceiver>, bool, bool) at /home/ibon/v8/v8/out.gn/aar_lkgr_64/../../src/api-natives.cc:375
Stack frame         #02 pc 000000000056ddc4  /data/app/com.boyaa.v8wrapper-gc82kSUIyk_jPb6OjAZERw==/lib/arm64/libnative-lib.so: Routine v8::internal::ApiNatives::InstantiateObject(v8::internal::Handle<v8::internal::ObjectTemplateInfo>, v8::internal::Handle<v8::internal::JSReceiver>) at /home/ibon/v8/v8/out.gn/aar_lkgr_64/../../src/api-natives.cc:547
Stack frame         #03 pc 00000000000f4774  /data/app/com.boyaa.v8wrapper-gc82kSUIyk_jPb6OjAZERw==/lib/arm64/libnative-lib.so: Routine v8::ObjectTemplate::NewInstance(v8::Local<v8::Context>) at /home/ibon/v8/v8/out.gn/aar_lkgr_64/../../src/api.cc:6733 (discriminator 2)
Stack frame         #04 pc 00000000000cfa40  /data/app/com.boyaa.v8wrapper-gc82kSUIyk_jPb6OjAZERw==/lib/arm64/libnative-lib.so (WrapGamerObject(v8::Isolate*, Gamer*)+588): Routine WrapGamerObject(v8::Isolate*, Gamer*) at F:\\ubuntu\\share\\V8Android\\app\\src\\main\\cpp/util.cpp:208
Stack frame         #05 pc 00000000000d22cc  /data/app/com.boyaa.v8wrapper-gc82kSUIyk_jPb6OjAZERw==/lib/arm64/libnative-lib.so (initV8()+792): Routine initV8() at F:\\ubuntu\\share\\V8Android\\app\\src\\main\\cpp/native-lib.cpp:67
Stack frame         #06 pc 00000000000d35d0  /data/app/com.boyaa.v8wrapper-gc82kSUIyk_jPb6OjAZERw==/lib/arm64/libnative-lib.so (Java_com_boyaa_v8wrapper_MainActivity_nativeInit+72): Routine Java_com_boyaa_v8wrapper_MainActivity_nativeInit at F:\\ubuntu\\share\\V8Android\\app\\src\\main\\cpp/native-lib.cpp:165
Stack frame         #07 pc 00000000000092b8  /data/app/com.boyaa.v8wrapper-gc82kSUIyk_jPb6OjAZERw==/oat/arm64/base.odex (offset 0x9000)

以上是关于Android NDK 调试和分析的主要内容,如果未能解决你的问题,请参考以下文章

使用Android Studio 进行NDK开发和调试

cocos2d-x android怎么真机调试

Android NDK 开发NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )

Android NDK 开发NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )

android NDK开发在本地C/C++源码中设置断点单步调试具体教程

android 通过adb 和 ndk调试堆栈