背景
最近公司项目需要软件(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工具的目录添加到了环境变量中,就不需要每次去到那个目录里执行命令行了)
(这里我把addr2line工具的目录添加到了环境变量中,就不需要每次去到那个目录里执行命令行了)
以上就是在调用项目或第三方so库发生崩溃时的定位方式。在实际开发过程中,可能会遇到各种各样so库崩溃,还需要结合实际情况分析判断。
 
                   
                   
                   
                   
                             
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                  
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            