我们在使用第三方崩溃统计工具时,经常见到如下图:
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] <ClassB 0x1c00d9de0> 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