设置Xcode debug模式下也生成dSYM文件:
ViewController.m核心代码
@interface ViewController ()
@property (nonatomic, assign) Person *person;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *p = [Person new];
self.person = p;
}
- (IBAction)click:(id)sender {
NSString *name = self.person.name; //野指针触发crash代码
}
Person.h核心代码
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@end
野指针crash堆栈:
image list 获取 Mach-O 文件加载到内存的首地址:
获取dSYM起始地址命令:
otool -l OCCrashDemo.app.dSYM/Contents/Resources/DWARF/OCCrashDemo | grep __TEXT -C 5
结果如下:
计算click方法在dSYM中的地址:
由于iOS加载 Mach-O 文件时为了安全使用了 ASLR(Address Space Layout Randomization) 机制,导致二进制 Mach-O 文件每次加载到内存的首地址都会不一样,但是计算规则是一致的:
click方法在 Mach-O 文件中的偏移量 = click运行时堆栈地址 - Mach-O 文件加载到内存的首地址,即offset = 0x0000000104b01b98 - 0x0000000104b00000 = 0x0000000000001b98
click方法在dSYM中的地址 = dSYM起始地址 + click方法在 Mach-O 文件中的偏移量,即address = 0x0000000100000000 + 0x0000000000001b98 = 0x0000000100001b98
根据dSYM地址获取具体行数命令:
dwarfdump --arch arm64 --lookup 0x0000000100001b98 OCCrashDemo.app.dSYM