SO库崩溃定位

        背景

        最近公司项目需要软件(Android)调用算法(C++)获取一些数值。需要用到JNI,JNI如何使用本篇不描述。本篇只说明下,C++(Native层)发生崩溃后如何进行定位,大概分为三步。

        一、找到tombstone文件

        一般发生Native层崩溃后,软件会直接闪退,这个崩溃并不像Android一样崩溃后有UncaughtExceptionHandler异常处理机制,可以利用这个机制做一些特殊处理。但android有一个自动记录Native崩溃的文件,即Tombstone(墓碑文件),该文件通常位于“/data/tombstones"目录下,打开一个tombstone文件,一般是长这样的,如图:

图一

图二

        图一主要展示了一些设备架构、应用包名等信息,其中

展示了错误信号,指明发生了什么类型的崩溃。

        我们需要用到的关键信息在图二的backtrace中,阅读方法与阅读android崩溃的堆栈信息是一样的,最接近崩溃点的地方在最上面。我们查看与我们相关的崩溃的so库(#02),找到它对应的地址0003e343,这个后面会用到。

        二、找到.so文件

        so文件在项目目录中找,项目目录\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libXXXXNative.so 
(注意:如果对c++文件有改动,每次编译完需要重新获取.so文件)

        三、使用addr2line工具

        addr2line工具在ndk中找,NDK目录\toolchains\llvm\prebuilt\windows-x86_64\bin\。

该目录下有好几个addr2line工具,根据自己设备架构找到对应的即可。我使用的是arm-linux-androideabi-addr2line.exe。

        将刚才找到的.so文件拷贝到此目录下,右键运行命令行,输入arm-linux-androideabi-addr2line -C -f -e libXXXXNative.so 0003e343(这里的地址就是在步骤一中找到的地址),回车即可显示崩溃代码所在具体的c++文件和对应的行号,如图:

(这里我把addr2line工具的目录添加到了环境变量中,就不需要每次去到那个目录里执行命令行了)

        以上就是在调用项目或第三方so库发生崩溃时的定位方式。在实际开发过程中,可能会遇到各种各样so库崩溃,还需要结合实际情况分析判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值