下载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