breakpad for iOS

下载google breakpad

https://github.com/google/breakpad.git

$ cd /Users/XXXX/Desktop/breakpad-main

$ ./configure

$ make

执行上面的命令后

打开/Users/XXXX/Desktop/breakpad-main/src/processor目录下,会生成 minidump_stackwalk 工具。

打开/Users/XXXX/Desktop/breakpad-main/src/tools/mac/dump_syms/dump_syms.xcodeproj ,编译dump_syms工具。

打开已有的ios工程,把/Users/XXXX/Desktop/breakpad-main/src/client/ios/Breakpad.xcodeproj拖进工程

(或者把相应用到的类文件整理好拖到工程,但注意事项有三点:

1、整理好的breakpad文件夹,最好放到与工程 XXXX.xcodeproj 运行文件同一文件夹目录下;方便设置Header Search Paths [  ./breakpad/src/  ]

2、有些类文件,必需在文件夹目录下存在,但又不能引入到工程项目,有如下文件:

common/basictypes.h

common/macros.h

common/memory_allocator.h

common/using_std_string.h

common/mac/byteswap.h

common/mac/GTMDefines.h

google_breakpad文件夹下的文件

3、需要加入相关的库,具体如下:

TARGETS >Build Phases >Link Binary with Librairies > + >搜索

libc++.1.tbd

libz.1.tbd

coreTelephony.framework)

#import "client/ios/BreakpadController.h"

在didFinishLaunchingWithOptions方法里加入

[[BreakpadController sharedInstance] start:YES];

 [[BreakpadController sharedInstance] setUploadingEnabled:YES];

在applicationWillTerminate方法时加入

//当应用结束生命周期 调用stop, 避免被误报

- (void)applicationWillTerminate:(UIApplication *)application{

    [[BreakpadController sharedInstance] stop];

}

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

BreakpadProduct        String            程序名称

BreakpadVersion          String            程序版本

BreakpadURL                String            上传dump的服务器地址

NSString *product = [parameters objectForKey:@BREAKPAD_PRODUCT];

NSString *version = [parameters objectForKey:@BREAKPAD_VERSION];

NSString *urlStr = [parameters objectForKey:@BREAKPAD_URL];

最好保证 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];

会将数据上传到服务器。

————————————————

原文链接:https://blog.csdn.net/losemymind/article/details/39157715

你可能感兴趣的:(breakpad for iOS)