IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android native crash 分析和解决 -> 正文阅读

[移动开发]android native crash 分析和解决

常见错误:

初始化错误
数组/迭代器/指针访问越界
访问无效/空指针对象
内存泄露
参数错误
堆栈溢出
类型转换错误

1,日志及其解释:

日志收集,默认已经有了哈,如果是自己测试收集日志可以直接:adb logcat -b crash > logs.txt

06-30 18:19:07.867 F/DEBUG   (32224): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-30 18:19:07.868 F/DEBUG   (32224): Build fingerprint: 'Redmi/phoenix/phoenix:10/QKQ1.190825.002/V11.0.13.0.QGHCNXM:user/release-keys'
06-30 18:19:07.868 F/DEBUG   (32224): Revision: '0'
06-30 18:19:07.868 F/DEBUG   (32224): ABI: 'arm'
06-30 18:19:07.868 F/DEBUG   (32224): Timestamp: 2021-06-30 18:19:07+0800
06-30 18:19:07.868 F/DEBUG   (32224): pid: 32190, tid: 32214, name: Thread-3  >>> com.eastmoney.avdemo <<<
06-30 18:19:07.868 F/DEBUG   (32224): uid: 10432
06-30 18:19:07.868 F/DEBUG   (32224): signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xc275e21c (*pc=0x03eeca)
06-30 18:19:07.868 F/DEBUG   (32224):     r0  00000000  r1  adc5b26a  r2  00430000  r3  00000003
06-30 18:19:07.868 F/DEBUG   (32224):     r4  c275dfc5  r5  d3ced500  r6  bfb83000  r7  c207b938
06-30 18:19:07.868 F/DEBUG   (32224):     r8  00000000  r9  d2df1200  r10 c207ba68  r11 c207b9ec
06-30 18:19:07.868 F/DEBUG   (32224):     ip  eb3f7464  sp  c207b920  lr  eb38a51f  pc  c275e21c
06-30 18:19:07.893 I/chatty  (  891): uid=1000(system) Binder:891_1 identical 2 lines
06-30 18:19:07.913 D/BufferQueueLayer(  891): Launcher new frame Arrived
06-30 18:19:07.919 W/AudioFlinger(  886): RecordThread: buffer overflow
06-30 18:19:07.927 D/BufferQueueLayer(  891): Launcher new frame Arrived
06-30 18:19:08.057 F/DEBUG   (32224): 
06-30 18:19:08.057 F/DEBUG   (32224): backtrace:
06-30 18:19:08.057 F/DEBUG   (32224):       #00 pc 0000b21c  /data/app/com.eastmoney.avdemo-YiP_dJ7q3lJ9XUmWTX0t-g==/lib/arm/libmp3lame.so (Java_com_eastmoney_avdemo_MainActivity_encode+108) (BuildId: cb7c357001d8fce8380f5394bdd068f61a6f8b13)
06-30 18:19:08.057 F/DEBUG   (32224):       #01 pc 00009101  /data/app/com.eastmoney.avdemo-YiP_dJ7q3lJ9XUmWTX0t-g==/oat/arm/base.odex (art_jni_trampoline+120)
06-30 18:19:08.057 F/DEBUG   (32224):       #02 pc 000d7bc5  /apex/com.android.runtime/lib/libart.so (art_quick_invoke_stub_internal+68) (BuildId: 6849d5cbd4a7a5761647e62bbaa3d8d6)
...

其中的日志含义大概解释如下(按照行解释):
第二行是当前rom的fingerprint,一般包含了手机的牌子(redmi)、android系统版本(10)、MIUI版本(V11.0.13.0.QGHCNXM)、release版本(rom一般内部测试版是debug版);
第四行是当前的cpu架构:arm;
第五行是crash的时间戳:2021-06-30 18:19:07+0800;
第六行是当前的进程Id、线程Id\名字和applicationId(一般主线程crash的话这里的进程Id和线程Id一样);
后面的是
错误地址:fault addr 0xc275e21c (*pc=0x03eeca);
寄存器的dump信息:rx/dx等(r0 00000000 r1 adc5b26a r2 00430000 r3 00000003);
崩溃的地方调用堆栈信息: #00 pc 0000b21c /data/app/com … 。

上面日志可以看到自己的so库是libmp3lame.so,

2,使用工具定位问题代码

2.1,ndk-stack

上面日志里面的backtrace已经显示了代码的调用堆栈了,如果没有显示,可以使用ndk自带的ndk-stack工具转换成带调用栈信息的日志,命令格式和使用如下:

格式:

Usage: ndk-stack -sym PATH [-dump PATH]
Symbolizes the stack trace from an Android native crash.

  -sym PATH   sets the root directory for symbols
  -dump PATH  sets the file containing the crash dump (default stdin)

See <https://developer.android.com/ndk/guides/ndk-stack.html>.

使用

D:\>ndk-stack -sym D:\Work\WorkSpace\AVDemo\app\build\intermediates\ndkBuild\release\obj\local\armeabi\libmp3lame.so -dump D:\logs.txt

得到下面:

 #00 pc 0000b21c  /data/app/com.eastmoney.avdemo-YiP_dJ7q3lJ9XUmWTX0t-g==/lib/arm/libmp3lame.so (Java_com_eastmoney_avdemo_MainActivity_encode+108)

注意,上面的so库是要带symbols的,比打包进apk的要大很多,项目中位置是:app\build\intermediates\ndkBuild\debug\obj\local\armeabi\libmp3lame.so。
还有,上面的行号不是源码中的行号,但是通过上下行也可以看到调用顺序。

2.2,addr2line.exe

要想知道具体的源码调用行号,需要使用arm-linux-androideabi-addr2line.exe

使用格式:
arm-linux-androideabi-addr2line –e XXXX.so pc地址1 pc地址2 …
如下:

D:\Program_Files\NDK\android-ndk-r13b-windows-x86_64\android-ndk-r13b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>arm-linux-androideabi-addr2line.exe -e D:\Work\WorkSpace\AVDemo\app\build\intermediates\ndkBuild\release\obj\local\armeabi\libmp3lame.so 0000b21c
D:/Work/WorkSpace/AVDemo/app/src/main/cpp/lame/./native-lib.cpp:26

2.3,objdump.exe

如果还想看看so转汇编的文件可以使用objdump工具,这个可以再次确认具体的错误地址对应的是哪个方法。
命令如下:

D:\>D:\Program_Files\NDK\android-ndk-r13b-windows-x86_64\android-ndk-r13b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-objdump.exe -S D:\Work\WorkSpace\AVDemo\app\build\intermediates\ndkBuild\release\obj\local\armeabi\libmp3lame.so > lxs.asm

得到的lxs.asm文件如下:

extern "C"
JNIEXPORT jint JNICALL
Java_com_eastmoney_avdemo_MainActivity_encode(JNIEnv *env, jobject thiz, jbyteArray buffer_l,
                                              jbyteArray buffer_r, jint length) {
    b1b0:	b5f0      	push	{r4, r5, r6, r7, lr}
    b1b2:	af03      	add	r7, sp, #12
    b1b4:	b083      	sub	sp, #12
    b1b6:	b404      	push	{r2}
    b1b8:	bc40      	pop	{r6}
    b1ba:	9601      	str	r6, [sp, #4]
    b1bc:	b401      	push	{r0}
    b1be:	bc20      	pop	{r5}
	...
    b20a:	b420      	push	{r5}
    b20c:	bc01      	pop	{r0}
    b20e:	9901      	ldr	r1, [sp, #4]
    b210:	b440      	push	{r6}
    b212:	bc04      	pop	{r2}
    b214:	9b02      	ldr	r3, [sp, #8]
    b216:	f031 fd23 	bl	3cc60 <__aeabi_llsl+0x16c>
    b21a:	46c0      	nop			; (mov r8, r8)
    b21c:	0003eeca 	.word	0x0003eeca

上图的最后一行可以看到,和错误地址:fault addr 0xc275e21c (*pc=0x03eeca)对应上了,也和PC地址pc 0000b21c 对应上了。
可以查看到确认是代码中最后一行没有renturn导致crash。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-07 00:02:59  更:2021-07-07 00:04:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 5:49:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码