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的调试和分析主要有以下几种方法:
LLDB:故障调试,断点和参数查看,用于开发者有源的情况下,多用于开发阶段;
ndk-gdb:k-build脚本构建的,当前Android工作室默认已支持采用ndCMake方式构建工程,所以不是很推荐;
ndk-stack:适用于发布版本,或者用户反馈问题(提供了错误的logcat日志)等情况,即直接分析NDK错误日志,分析C++源码的错误点。
AddressSanitize:google官方提供的检测C/C++代码的内存错误的工具(除了Android,其他平台也可以使用)。
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 NDK 开发NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )
Android NDK 开发NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )