arm-linux-androideabi-addr2line 说明:
arm-linux-androideabi-addr2line
是 NDK 自带的调试工具,可以用来分析 so 崩溃时输出的的内存地址。
使用方式:
首先定位工具的路径,并通过 cmd 进入到 arm-linux-androideabi-addr2line
所在的文件夹内,如果是对 Android 开发没有一点经验和概念的小白,比如我,在寻找这个文件的时候就发现自己安了好几个版本的 ndk,不要着急,随便找一个就可以。之后在搜索栏直接搜索这个工具名。
这里我进入的是 ndk-r13b 这个文件夹进行的搜索
之后就是通过 cmd 进入到这个路径
执行命令:
arm-linux-androideabi-addr2line -C -f -e so库文件的路径 具体的内存地址
比如我需要分析的 crash 信息如下:
Caused by: java.lang.Error: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000004
Build fingerprint: 'xxxxx 测试信息'
Revision: '0'
pid: 21666, tid: 21847, name: UnityMain >>> xxx 游戏包名 <<<
r0 980ae958 r1 00000004 r2 00430000 r3 b11dc6dd
r4 980ae958 r5 980ae958 r6 ffffffff r7 980afe78
r8 00000000 r9 a4b2ce00 sl 00000001 fp 980ae948
ip 002e3688 sp 980ae938 lr 9738a941 pc 978460f8 cpsr 86371100
at libunity.006ee0f8(Native Method)
at libunity.0023293d(Native Method)
at Unknown.fffffffd(Unknown Source:0)
这里显示了 libunity.006ee0f8
和 libunity.0023293d
两个问题,所以 so 库文件就是要使用 libunity.so。为了简便起见,我将这个文件复制到了 F 盘下。
需要执行的命令和结果如下所示:
可以看出是在调用 UnitySendMessage
方法后调用了 JNI_OnUnload
方法,然后就 crash 了。