Google Breakpad IOS

下载google breakpad

$ svn checkout http://google-breakpad.googlecode.com/svn/trunk/ google-breakpad-read-only
$ cd google-breakpad-read-only
$ ./configure
$ make

执行上面的命令后在google-breakpad-read-only/src/processor录下会生成 minidump_stackwalk 工具。

打开google-breakpad-read-only/src/tools/mac/dump_syms/dump_syms.xcodeproj编译dump_syms工具。

打开已有的ios工程,把google-breakpad-read-only/src/client/ios/Breakpad.xcodeproj拖进工程

#import "client/ios/BreakpadController.h"

在didFinishLaunchingWithOptions方法里加入

[[BreakpadController sharedInstance]start: YES];

[[BreakpadController sharedInstance] setUploadingEnabled:YES];

在applicationWillTerminate方法时加入

[[BreakpadController sharedInstance]stop];

在项目的 Info 的Custom iOS Target Properties 中添加 google breakpad 的必要设置。

BreakpadProduct         String             程序名称

BreakpadVersion          String             程序版本

BreakpadURL                String             上传dump的服务器地址


最好保证 Breakpad 项目的配置和自己项目的配置一致(架构和编译选项),以免出现一些连接不过的问题。

运行程序,当程序发生崩溃时将会生成dmp文件,路径为 /var/mobile/Applications/xxxx-xxx-xxxx/Library/Caches/Breakpad/

xxxx-xxx-xxxx 为程序在设备中的ID,根据项目填写

在上面我们已经编译好 dump_syms ,和 minidump_stackwalk 。接下来用这两个工具生成 symbols文件和 堆栈文件

将 dump_syms ,minidump_stackwalk  项目的.app文件和.dSYM文件以及.dmp文件拷贝到同一个目录(不是必须的,这里为了方便)。

生成Symbols文件:

$ ./dump_syms -a armv7s myapp.app.dSYM > myapp.sym

查看myapp.sym文件内容,头部会有,BB0351B14DDA42A6D36FA6EA358B49D50 这样的字符串


MODULE mac armv7s BB0351B14DDA42A6D36FA6EA358B49D50 myapp
继续执行命令


$ mkdir -p symbols/myapp/BB0351B14DDA42A6D36FA6EA358B49D50 /
$ mv myapp.sym symbols/myapp/BB0351B14DDA42A6D36FA6EA358B49D50 /
$ ./minidump_stackwalk xxxx-xxxx-xxxx-xxx.dmp symbols > crashed.log
输出信息

Thread 12 (crashed)  
 0  myapp.so!AppDelegate::applicationDidFinishLaunching() [AppDelegate.cpp : 44 + 0x4]  
     r0 = 0x00000000    r1 = 0x00000001    r2 = 0x5a18a8e8    r3 = 0x5a18a6b8  
     r4 = 0x56ea70f0    r5 = 0x5c5c47b8    r6 = 0x00000000    r7 = 0x59f59f24  
     r8 = 0x5e5b6c58    r9 = 0x59f59f1c   r10 = 0x5c5c47c8   r12 = 0x00000000  
     fp = 0x5e5b6b60    sp = 0x5e5b6b18    lr = 0x5dc2d3e4    pc = 0x5db3e37c 
定位到是 AppDelegate.cpp的44行崩溃。
如果没有符号文件,比如这样导出crash log

./minidump_stackwalk xxxx-xxxx-xxxx-xxx.dmp > crashed.log

(xxxx-xxxx-xxxx-xxx.dmp 为崩溃的dmp文件。)

打开crashed.log文件,类似下面这种内容的地方就是程序崩溃的地方:

Thread 0 (crashed)
0 myapp + 0x264f2

0x264f2 就是程序崩溃的偏移地址,我们几种方法可以定位到是哪个文件的哪一行崩溃。

方法一:

打开.sym文件,查找264f2

264f2 2 44 2491

其中 264f2是地址    2是偏移量  44是崩溃的行数  2491是文件ID

接着在.sym文件中查找 2491 

FILE 2491  /Project/myapp/main.cpp

这就是崩溃的文件,

最终我们获取的崩溃位置是  /Project/myapp/main.cpp的44行 。

方法二:

获取程序起始地址 + 偏移地址,使用 dwarfdump 工具定位

otool -arch armv7 -l /Users/crash/myapp.app/myapp  | grep -B 1 -A 10 "LC_SEGM" | grep -B 3 -A 8 "__TEXT"
输出信息

Load command 1
     cmd LC_SEGMENT
 cmdsize 736
 segname __TEXT
  vmaddr 0x00004000
  vmsize 0x001ec000
 fileoff 0
filesize 2015232
 maxprot 0x00000005
initprot 0x00000005
  nsects 10
   flags 0x0


其中 vmaddr 0x00004000 就是程序的起始地址,

0x000264f2 + 0x00004000 = 0x0002a4f2 (symbol address)

dwarfdump --lookup 0x0002a4f2 -arch armv7s myapp.app.dSYM | grep "Line"
输出信息:

Line table dir : '/project/myapp'
Line table file : 'main.cpp' line 44, column 0 with start address 0x000000000002a4f2
这就是最终崩溃的地方,


Dump 信息上传:

IOS 上传dump数据主要在 uploader.mm 和 HTTPMultipartUpload.m 文件中

上传的dump数据格式为:dump数据格式

其中包含了程序名称,平台,版本 dump文件数据的,http服务器需要解析这些数据。

下次程序启动时

[[BreakpadController sharedInstance] setUploadingEnabled:YES];

会将数据上传到服务器。


















你可能感兴趣的:(Google,Breakpad)