Android- NDK编译APK中native死机调试

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

以前在服务器编译android源码在盒子上运行死机,

可通过文章: android 动态库死机调试方法 ,我们这里说的是利用eclipse+NDK编译apk的native代码如何调试

http://blog.csdn.net/andyhuabing/article/details/7074979


众所周知,调试android java程序可以直接在eclipse上进行单步调试,但是调试android jni函数却无法进行单步跟踪而只能加打印进行调试,这样子效率将会大大降低。而程序崩溃无疑是程序员最头疼的事情,而android native程序崩溃简直是令程序员崩溃。
Android java程序在异常之前还打印出代码调用栈,让程序员有迹可寻,结合单步调试,定位问题相对容易些。

请看一断死机的logcat 打印,你能否找到死机哪个函数呢?而这就是我们需要解决的问题


I/DEBUG   (  669): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (  669): Build fingerprint: 'generic/generic/generic:2.3.1/GRH78/eng.root.20120613.153206:eng/test-keys'
I/DEBUG   (  669): pid: 1140, tid: 1150  >>> com.ipanel.portal <<<
I/DEBUG   (  669): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00241000
I/DEBUG   (  669):  r0 00241000  r1 00000000  r2 000da324  r3 00000000
I/DEBUG   (  669):  r4 00000000  r5 00000000  r6 00000000  r7 00000000
I/DEBUG   (  669):  r8 00000280  r9 8484e2d8  10 000001e0  fp 0012d184
I/DEBUG   (  669):  ip 00000000  sp 48af05e8  lr 00000000  pc afd1195c  cpsr 20000010
I/DEBUG   (  669):          #00  pc 0001195c  /system/lib/libc.so
I/DEBUG   (  669):          #01  pc 00301874  /data/data/com.ipanel.portal/lib/libportal_jni.so
I/DEBUG   (  669):          #02  pc 00301874  /data/data/com.ipanel.portal/lib/libportal_jni.so
I/DEBUG   (  669):          #03  pc 00301874  /data/data/com.ipanel.portal/lib/libportal_jni.so
I/DEBUG   (  669):          #04  pc 00301874  /data/data/com.ipanel.portal/lib/libportal_jni.so
I/DEBUG   (  669):          #05  pc 00301874  /data/data/com.ipanel.portal/lib/libportal_jni.so


从NDK r5b开始,增加了调试的支持,引入了ndk-gdb脚本,可以单步调试程序。
而NDK r6给我们带来了一个惊喜,那就是ndk-stack工具,其作用就是将上面的栈打印翻译成我们能懂的描述。


下面就看看ndk-stack是如何使用的吧。
首先,要求动态链接库带调试信息,如果是用的ndk-build编译native代码,在$PROJECT_PATH/obj/local/<ab>下就有,<ab>代表设备的ABI(比如,缺省就是armeabi)。如果是用的cmake编译native代码,需要将CMAKE_BUILD_TYPE定义成Debug,判断是否编译了带调试信息的版本,可以检查最后的编译命令有没有带-g参数。
编译出的so通常位于$PROJECT_PATH/libs/<ab>下。


接下来输入如下命令,指定带调式符号的so所在的路径(用$SYMBOL_SO_PATH指代):
adb logcat | ndk-stack –sym $SYMBOL_SO_PATH


ARM平台调式命令:
a、将C:\NDK\android-ndk-r6b添加到windows的path环境变量中
b、adb connect ip(xx.xx.xx.xx)
c、adb logcat > 1.log
d、cat 1.log |  ndk-stack -sym $(project_loc)\obj\local\armeabi
输出:
D:\hisi-tools\sdk-tools>cat 1.log |  ndk-stack -sym E:\svnhome\apptv\r23-jilin\p
ackages\iPanel30Portal\obj\local\armeabi
********** Crash dump: **********
Build fingerprint: 'generic/generic/generic:2.3.1/GRH78/eng.root.20120613.153206
:eng/test-keys'
pid: 1140, tid: 1150  >>> com.ipanel.portal <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00241000
Stack frame #00  pc 0001195c  /system/lib/libc.so
Stack frame #01  pc 00301874  /data/data/com.ipanel.portal/lib/libportal_jni.so:
 Routine ipanel_nvram_task_burn in ../../src/sdk/jilin_2011/proj-sdk/include/../
lib_ffs/ffs_task.c:416
Stack frame #02  pc 00301874  /data/data/com.ipanel.portal/lib/libportal_jni.so:
 Routine ipanel_nvram_task_burn in ../../src/sdk/jilin_2011/proj-sdk/include/../
lib_ffs/ffs_task.c:416


ok,即可定位程序崩溃的位置


对于mips平台来说,使用的命令稍微有些不同,只能使用mipsxx-address2linx工具


ARM平台路径:
C:\NDK\android-ndk-r6b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\bin
调试命令:
$:cat 1.log | C:\NDK\android-ndk-r6b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\bin\arm-linux-androideabi-addr2line.exe -e E:\svnhome\apptv\r23-jilin\packages\iPanel30Portal\obj\local\armeabi\libportal_jni.so 00301874
输出结果:
/usr/local/ipanel_rcc2/build/sdk/../../src/sdk/jilin_2011/proj-sdk/include/../li
b_mem/memx_custom.c:83
与利用ndk-stack有所不同,不过都能定位于具体的文件及行数


MIPS平台:
C:\NDK\android-ndk-r8-windows\toolchains\mipsel-linux-android-4.4.3\prebuilt\windows\bin
调试命令:
$:cat 1.log | C:\NDK\android-ndk-r8-windows\toolchains\mipsel-linux-android-4.4.3\prebuilt\windows\bin\mipsel-linux-android-addr2line.exe [address]
基本上与ARM同样的方式调试


利用address2line的注意点:

I'm using NDK r5, so the executable I'm using is located at $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin; make sure that is in your $PATH. The command to use looks like

arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so <address>

Or, for the case above:

arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libnativemaprender.so 0003deb4

Note:

  • The -C flag is to demangle C++ code
  • Use the .so file under obj/local/armeabi, since this is the non-stripped version

如果大家还有更好的调试方法,请也提供下给给受苦调试android死机的同学们一个“脱难”的方法。


Android Native崩溃分析方法记录 Signal含义介绍:https://www.mkssoftware.com/docs/man5/siginfo_t.5.asp Native崩溃堆栈解读 进程信息:pid表示进程号,tid表示线程号,name表示进程名 错误信号:signal 11表示信号的数字,SIGSEGV表示信号的名字,code 1(SEGV_MAPERR)表示出错代码,fault addr 00000000 表示出错的地址。 寄存器快照:进程收到错误信号时保存下来的寄存器快照,一共有15个寄存器。 堆栈信息:##00表示栈顶, 阅读详情

相关推荐

Android Native Crash奔溃

Android系统全局来说,Crash 通常分为 App/Framework Crash,Native Crash,以及 Kernel Crash。对于 App 层或者 Framework 层的 Crash(即 Java 层面 Crash),那么往往是通过抛出未捕获异常而导致的 Crash。至于 Kernel Crash,很多情况是发生 Kernel panic,对于内核崩溃往往是驱动或者硬件出现故障。

weixin_49303682的博客 1199

安卓NDK程序崩溃调试方法

1.通过tombstones查看崩溃原因: 程序编译: make clean make DEBUG=y cd /data/tombstones ls -lt head -n 50 to*01 ubuntu上 make DEBUG=y c++filt _ZNK7android7RefBase9decStrongEPKv aarch64-linux-android-addr2line -e /home/test_code/tsest.so -a 000000000001b26c 系统产生较多sh.

u014415522的专栏 547

Android anr 调试分析,Android 调试native的crash和anr

Java 浅析三大特性之一多态Java 浅析三大特性之一多态 之前我们的文章讲了Java的封装和继承,封装讲的时候,并没有体现出来封装的强大之处,反而还要慎用封装.因为这时的封装还没有和多态联系到一起,还无法看出向上转型的厉害之处 ...Linux下mysql主从配置mysql服务器的主从配置,这样可以实现读写分离,也可以在主库挂掉后从备用库中恢复需要两台机器,安装mysql,两台机器要在相通的局...

weixin_42531588的博客 274

Android Native Crash崩溃及错误原因分析二-实战解决

一. 简述 之前有一篇文章讲诉了Android实际开发过程中一些崩溃的原因,以及对崩溃类型做了详细的介绍,简单回顾一下:Crash类型:Java和Native,JavaCrash中明显会打印出AndroidRuntime的log,而NativeCrash则Logcat 会在“debug”tag下输出dump信息,开发过程中javacrash较好分析,NativeCrash则相对较难, 二.

为码消得人憔悴 2万+

Android-NDK编译APKnative死机调试

众所周知,调试android java程序可以直接在eclipse上进行单步调试,但是调试android jni函数却无法进行单步跟踪而只能加打印进行调试,这样子效率将会大大降低。而程序崩溃无疑是程序员最头疼的事情,而android native程序崩溃简直是令程序员崩溃。 Android java程序在异常之前还打印出代码调用栈,让程序员有迹可寻,结合单步调试,定位问题相对容易些。 请看

RobertBaker的专栏 1233

java多线程adb安装apk卡死_Android- NDK编译APKnative死机调试

以前在服务器编译Android源码在盒子上运行死机,可通过文章: android 动态库死机调试方法 ,我们这里说的是利用eclipse+NDK编译apknative代码如何调试 http://www.linuxidc.com/Linux/2012-06/63026.htm众所周知,调试android java程序可以直接在eclipse上进行单步调试,但是调试android jni函数却无法进...

weixin_39702649的博客 272

Android 知识体系

Android归档前言 前言 感谢: Gityuan:Android系统架构开篇 刘望舒的博客:知识体系

许浑的博客 8118

Android系统调试-程序崩溃调试

Android系统调试Native 调试Android系统对于Native(C/C++)应用程序的调试手段比单纯的linux系统更为丰富.一般我们调试linux系统的应用程序崩溃问题,都是通过coredump文件与gdb结合调试的手段.但是Android系统的天然不支持这种调试方式,其在内核中就没有启用coredump生成机制,那么Android系统下我们使用什么方式调试Native程序的崩溃问题

飞翔de刺猬 4614

Android native程序的调试

在程序开发中,对程序进行调试是不可或缺的环节,它能帮助我们快速定位问题的bug,解决程序运行过程中各种异常问题。Android studio跟PC端的Visual studio 一样可以启动程序运行调试或attach 一个进程在线调试。 ...

江海细流的专栏 1781

Android 调试native的crash和anr

1.于trace找到相应的库。例如 liba.so和相应的地址信息 2.采用addr2line查看 addr2line住址 -e liba.so -f 要么 arm-eabi-addr2line 3.addr2line玩没有详细的功能使用objdump objdump -s -d liba.so > xxx.txt 要么arm-eab...

weixin_30399155的博客 148

Android Native崩溃信息分析和 工具(addr2line和ndkstack)使用

针对native的崩溃信息。一般来讲,较快的方式是直接检索到backtrace,然后通过分析和使用工具addr2line和 ndk-stack等定位到出问题的地方。

wangdsh的博客 4646

5.NDK Android jni开发 异常处理 native奔溃解决(相机图片美化)

http://www.droidsec.cn/常见android-native崩溃及错误原因/ https://blog.csdn.net/ddxxii/article/details/84781110 程序运行时常会碰到一些异常情况,例如: 做除法的时候除数为 0; 用户输入年龄时输入了一个负数; 用 new 运算符动态分配空间时,空间不够导致无法分配; 访问数组元素时,下标越界;打开文件读取时,文件不存在。 NDK异常信息一般有三个要素: 信号 调用栈信息 寄存器信息..

深南大盗的博客 1213

Android Native Crash问题定位与分析

Android Native Crash

老李的博客 635

android native中崩溃的调试办法

android native开发中遇到比较头疼的就是Fatal error 这时候传说中的gdb调试就该出场了 直接上干活,嘿嘿 1. 在命令行中执行下面的命令     /SDK目录/adb logcat | /NDK目录/ndk-stack -sym /Android Studio项目根目录/app/build/intermediates/jniLibs/debug

杨振辉的博客 2272

调试模式下启动时,Android应用程序崩溃

When I run in debug mode the app crashes, but when I just run it normally it works. 在调试模式下运行时,应用程序崩

xfxf996的博客 2899

Android平台Native代码的崩溃捕获机制及实现

Android平台native crash一直是crash里的大头。native crash具有上下文不全、出错信息模糊、难以捕捉等特点,比java crash更难修复。本文将详细阐述Android平台Native代码的崩溃捕获机制原理,以及如何实现Native崩溃捕获组件。

陆业聪 2万+

Android 平台 Native Crash 问题分析与定位

Android开发中通常是将Native层代码打包为.so格式的动态库文件,然后供Java层调用,.soAndroid系统自带的核心组件和服务,如多媒体库、OpenGLES图形库等引入的第三方库开发者自行编译生成的动态库。...

m0_70749039的博客 4078

Android 崩溃处理

Android 崩溃的那些事儿 转载:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=67#/detail/pc?id=1879 总结: 如果要给 crash 日志进行分类,可以分成 2 大类:JVM 异常(Exception)堆栈信息、native 代码崩溃日志。 JVM 异常堆栈信息 Java 中异常(Exception)分两种:检查异常 checked Exception 和非检查异常 unchecked Exception。 .

Android 597
上一篇: andorid- 利用非ui线程绘图方法
下一篇: Android - 动态库双向依赖解决方法
andyhuabing
博客等级 码龄19年 704粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值