Android NDK 调试和分析

简介

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

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

  • JNI官方文档

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

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

  • 2f4c9e36750758e354f782bb818df285.png

  • 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)

55b16101b679d046cb6493c7d42fe5a2.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值