dSYM文件生成及使用

DWARF与dSYM

符号这篇文章中stip调试符号的时候提到了DWARF,那么DWARF是什么?markdown

DWARF是一种被众多编译器和调试器使用的用于支持源代码级别调试的调试文件格式。app

dSYM文件就是保存按DWARF格式保存调试信息的文件。post

调试信息生成dSYM文件过程

  • 读取debug map
  • 从.o文件中加载DWARF
  • 从新定位全部地址
  • 最后将所有的DWARF打包成dSYM Bundle

1.准备test.m文件ui

void test(){
    
}
void test1(){
    
}
int global = 10;
int main(){
    global = 21;
    global = 20;
    test();
    test1();
   return 0;
}
复制代码

2.生成带调试信息的目标文件。终端使用以下命令:spa

//加上-g参数,生成调试信息
clang -c -g test.m -o test.o
复制代码

3.查看文件内是否有调试信息。终端使用以下命令:debug

objdump --macho --private-headers test.o
复制代码

图片.png 省略中间部位截图 图片.png3d

__DWARF段保存的是调试信息 4.生成dSYM文件。终端使用以下命令:调试

//-g1参数,在当前目录生成dSYM文件
clang -g1 test.m -o test
复制代码

图片.png

5.查看dSYM文件内容。终端使用以下命令:日志

dwarfdump test.dSYM
复制代码

图片.png 保存类符号的名称及地址code

使用dSYM文件恢复符号案例演示

1.新建工程,添加崩溃代码

-(void)testDwarf{
    NSArray *arr = @[];
    arr[0];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self testDwarf];
}
复制代码

图片.png Xcode很详细的打印的崩溃代码位置,可是上线的项目收集的崩溃信息可没有这么详细

2.在开发模式脱去全部符号包括调试符号

图片.png

项目编译改为release,不然没有dSYM文件生成,或修改配置,以下图 图片.png

再次运行项目查看看崩溃日志

图片.png

图片.png

Macho起始地址是0x0000000100000000,偏移都要在这个起始地址基础上再偏移。

图片.png

偏移量0x000000010526d000要减去起始地址0x0000000100000000获得新的偏移量0x526D000

真实的虚拟内存地址:0x000000010526f273-0x526D000 = 0x100002273

3.在dSYM文件中查找算出来的虚拟内存地址

图片.png cd到如上图目录下,执行:

dwarfdump --lookup 0x100002273 MyApp.app.dSYM
复制代码

图片.png

经过地址已经找到崩溃方法名称

相关文章
相关标签/搜索