iOS如何定位崩溃在哪一行

我们在使用第三方崩溃统计工具时,经常见到如下图:

0   CoreFoundation  0x1823c6d8c 0x182281000 + 1334668   __exceptionPreprocess (in CoreFoundation) + 228
1   libobjc.A.dylib 0x1815805ec 0x181578000 + 34284 objc_exception_throw (in libobjc.A.dylib) + 56
2   CoreFoundation  0x1823d4098 0x182281000 + 1388696   __methodDescriptionForSelector (in CoreFoundation) + 0
3   CoreFoundation  0x1823cc5c8 0x182281000 + 1357256   ___forwarding___ (in CoreFoundation) + 1380
4   CoreFoundation  0x1822b241c 0x182281000 + 201756    _CF_forwarding_prep_0 (in CoreFoundation) + 92
5   test    0x10146cc10 0x100d50000 + 7457808   -[ClassB sendAuthModel] (in test) + 396
6   test    0x1014264a0 0x100d50000 + 7169184   -[ClassA onConnect] (in test) + 684

只是这样只能看到是在sendAuthModel函数内崩溃的,但是并不知道是在具体的哪一行,如何定位是崩溃在哪行呢?

在sendAuthModel的最后加入

    NSArray *syms = [NSThread  callStackSymbols];
    if ([syms count] > 1) {
        for (int i = 0; i < 13; i++) {
            NSLog(@"<%@ %p> %@ - caller: %@ ", [self class], self, NSStringFromSelector(_cmd),[syms objectAtIndex:i]);
        }
    } else {
        NSLog(@"<%@ %p> %@", [self class], self, NSStringFromSelector(_cmd));
    }

并在函数最后增加个断点(为了执行image lookup -a address命令)
通过打印可以看到

2018-06-20 15:36:40.965642+0800 jingmai[6392:747560]  sendAuthModel - caller: 0   test          0x0000000101901370 -[ClassB sendAuthModel] + 1692

0x0000000101901370即执行打印时的栈地址
使用0x0000000101901370-0x69c(1692的16进制),得到的地址即sendAuthModel的起始地址,然后加上崩溃统计中的0x18c(396的16进制),既得到崩溃统计中崩溃的位置address。
最后使用image lookup -a address,就可以找到对应的行了。

当然到这还没有解决问题,只是找到出问题的行,至于是什么原因导致的,还需要继续去查找啦。

另外2个可能用到的命令:
image list
br set -a 0xaddress

参考:https://zhuanlan.zhihu.com/p/27359979

你可能感兴趣的:(iOS如何定位崩溃在哪一行)