不使用 symbolicatecrash 解析崩溃堆栈

http://blog.csdn.net/wihing/article/details/9022149

 如果 使用 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。
                相对地址可以算出符号,那么符号就可以算出相对地址。
                相对地址知道,就可以根据上面的公式反过来计算家在地址。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值