不使用 symbolicatecrash 解析崩溃堆栈

    如果  使用 symbolicatecrash 解析崩溃堆栈 不起作用,可以通过以下方式看看符号文件和堆栈是否是对应的:

        dwarfdump --uuid xxx.app
        dwarfdump --uuid xxx.app.dSYM
        grep "0x.*com.wihing.xxx .*<" NoSymbolsTestxxx.crash

    如果输出一样的uuid,那么就是对应的,此时symbolicatecrash应该可以正常解析符号。
    如果不一样,那么说明崩溃堆栈和符号文件对应不上,很可能是搞错版本,或者打包的时候有问题导致符号文件生成不正确。
    就算如此,我们还是可以尝试解析一下,通过一下几种方法:

    使用atos:
            
            atos  -arch armv7 -o [BinaryFile or dSYMFile] 0x431b 

    使用gdb:

            gdb appname.app.dSYM/Contents/Resources/DWARF/appname
            info line 0x431b

    使用dwarfdump:

            dwarfdump --lookup 0x431b --arch armv7 APP_BINARY_PATH

    以上使用的符号解析工具涉及到的地址,都是可执行文件上的相对于代码段的偏移地址。
    所以使用这些工具之前有两件事情需要了解:
    1、PIE pie编译选项
                开启这个编译选项的二进制文件其内部代码不使用绝对寻址,而是相对地址。
        这样就可以加载到内存的任意一个起始地址中运行,类似动态链接库的加载方式。
        这样做会提高安全性,不过我们不在这里展开讨论,包括实现的细节。
                关键是,开启这个选项会导致同一个程序每次崩溃的堆栈地址都会不一样。(iOS 4.3以上的系统开始支持PIE)
        
    2、算出相对地址
                其实公式很简单:
                    相对地址 = 内存地址 - 加载地址 + 二进制中的偏移地址
                关键是找出这几个地址:
                    内存地址:就是堆栈上的地址
                    加载地址:就是二进制文件加载到内存上的地址,可以从crash文件的binary image那一段看到。
                    二进制中的偏移地址:就是二进制文件中代码段的偏移地址,可以使用“otool -l”来查看。

                加载地址有时候不一定会有,不过还是可以算出来的,一般堆栈底端都是start或者ptread_start。
                相对地址可以算出符号,那么符号就可以算出相对地址。
                相对地址知道,就可以根据上面的公式反过来计算家在地址。
 



你可能感兴趣的:(不使用 symbolicatecrash 解析崩溃堆栈)