美文网首页
breakpad for iOS

breakpad for iOS

作者: chenyihai | 来源:发表于2021-08-25 22:18 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/hhoeiltx.html