iOS Crash手动符号化

154 阅读1分钟
设置Xcode debug模式下也生成dSYM文件:

WeChateff3b900475a2583de05484dfbdf67bf.png

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堆栈:

WeChat215a441e61abf0665cff6f80cf795d40.png

image list 获取 Mach-O 文件加载到内存的首地址:

WeChat8a83bfe55842c410ac1e3c323418321f.png

获取dSYM起始地址命令:

otool -l OCCrashDemo.app.dSYM/Contents/Resources/DWARF/OCCrashDemo | grep __TEXT -C 5

结果如下:

WeChat1b46098b4a3a178602ce5ec7fabd2d70.png

计算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

结果如下:

WeChat0a42c7a21087fed08a97664a6da9b650.png

参考