码迷,mamicode.com
首页 > 移动开发 > 详细

android 抓取native层奔溃

时间:2017-11-09 20:58:03      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:svn   bsp   ati   back   多个   完全   break   相同   ack   

使用android的breakpad工具

使用这个工具需要下载Breakpad的源码,然后进行编译,编译之后会生成两个工具

技术分享

技术分享

二、生成转换工具
1、下载BreakPad源代码
命令行输入:svn checkout http://google-breakpad.googlecode.com/svn/trunk/ google-breakpad-read-only

2、编译工具
①进入代码路径
cd google-breakpad-read-only/


②配置环境
./configure


③编译工具
make


3、看看以下工具是否存在:
google-breakpad-read-only/src/tools/linux/dump_syms/dump_syms
google-breakpad-read-only/src/processor/minidump_stackwalk

 这两个工具可以直接到csdn中去下载编译成功的

这个过程你需要编译出几个工具:minidump_stackwalk dump_syms等等

就是上面这两个工具

但是这里要注意不同的版本不一样,这里可以直接到csdn上去下载

集成到App中

这个过程你需要用ndk-build编译出.so文件,放到你的App工程中的libs目录下,并在Java层初始化Breakpad,如以下三步:

  1. 编译Android各个平台的.so文件
  2. 编写JNI层mapping文件
  3. 将.so文件和JNI mapping文件copy到项目中

当然,你也可以用开源的:https://github.com/yinyinnie/breakpad-for-android

技术分享

 

技术分享

 


 

1. 找到日志中的关键函数指针

https://www.cnblogs.com/willhua/p/6718379.html

其实很简单,就是找到backtrace信息中,属于我们自己的so文件报错的行。

首先要找到backtrace信息,有的手机会明确打印一行backtrace(比如我们这次使用的手机),那么这一行下面的一系列以“#两位数字 pc”开头的行就是backtrace信息了。有时可能有的手机并不会打印一行backtrace,那么只要找到一段以“#两位数字 pc ”开头的行,就可以了。

 

其次要找到属于自己的so文件报错的行,这就比较简单了。找到这些行之后,记下这些行中的函数地址

技术分享

 

2. 使用addr2line查找代码位置

执行如下的命令,多个指针地址可以在一个命令中带入,以空格隔开即可

[plain]  view plain copy
 
  1. arm-linux-androideabi-addr2line –e obj/local/armeabi/libhello-jni.so 00004de8 000056c8 00004fb4 00004f58  

结果如下
[plain]  view plain copy
 
  1. /android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/char_traits.h:229  
  2. /android-ndk-r9d/sources/cxx-stl/stlport/stlport/stl/_string.c:639  
  3. /WordSpaces/hello-jni/jni/hello-jni.cpp:69  
  4. /WordSpaces hello-jni/jni/hello-jni.cpp:6  

从addr2line的结果就能看到,我们拿到了我们自己的错误代码的调用关系和行数,在hello-jni.cpp的69行和61行(另外两行因为使用的是标准函数,可以忽略掉),结果和ndk-stack是一致的,说明ndk-stack也是通过addr2line来获取代码位置的。

3. 使用objdump获取函数信息

通过addr2line命令,其实我们已经找到了我们代码中出错的位置,已经可以帮助程序员定位问题所在了。但是,这个方法只能获取代码行数,并没有显示函数信息,显得不那么“完美”,对于追求极致的程序员来说,这当然是不够的。下面我们就演示怎么来定位函数信息。

 

使用如下命令导出函数表:

[plain]  view plain copy
 
  1. arm-linux-androideabi-objdump –S obj/local/armeabi/libhello-jni.so > hello.asm  

 

在生成的asm文件中查找刚刚我们定位的两个关键指针00004fb4和00004f58

 

技术分享

 

 

 

从这两张图可以清楚的看到(要注意的是,在不同的NDK版本和不同的操作系统中,asm文件的格式不是完全相同,但都大同小异,请大家仔细比对),这两个指针分别属于willCrash()和JNI_OnLoad()函数,再结合刚才addr2line的结果,那么这两个地址分别对应的信息就是:

[plain]  view plain copy
 
  1. 00004fb4: willCrash() /WordSpaces/hello-jni/jni/hello-jni.cpp:69  
  2. 00004f58: JNI_OnLoad()/WordSpaces/hello-jni/jni/hello-jni.cpp:61  

 

相当完美,和ndk-stack得到的信息完全一致!

技术分享

addr2line和堆栈中的相对地址就可以得到文件名和行号。当然前提是你要有一个debug版本、带有符号表的二进制文件。

技术分享

技术分享

 

android 抓取native层奔溃

标签:svn   bsp   ati   back   多个   完全   break   相同   ack   

原文地址:http://www.cnblogs.com/kebibuluan/p/7811133.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!