DWARF与dSYM
符号这篇文章中stip调试符号的时候提到了DWARF
,那么DWARF
是什么?
DWARF
是一种被众多编译器和调试器使用的用于支持源代码级别调试的调试文件格式。
dSYM
文件就是保存按DWARF
格式保存调试信息的文件。
调试信息生成dSYM文件过程
- 读取
debug map
- 从.o文件中加载
DWARF
- 重新定位所有地址
- 最后将全部的
DWARF
打包成dSYM Bundle
1.准备test.m
文件
void test(){
}
void test1(){
}
int global = 10;
int main(){
global = 21;
global = 20;
test();
test1();
return 0;
}
2.生成带调试信息的目标文件。终端使用如下命令:
//加上-g参数,生成调试信息
clang -c -g test.m -o test.o
3.查看文件内是否有调试信息。终端使用如下命令:
objdump --macho --private-headers test.o
省略中间部位截图
__DWARF
段保存的是调试信息
4.生成dSYM文件。终端使用如下命令:
//-g1参数,在当前目录生成dSYM文件
clang -g1 test.m -o test
5.查看dSYM文件内容。终端使用如下命令:
dwarfdump test.dSYM
保存类符号的名称及地址
使用dSYM文件恢复符号案例演示
1.新建工程,添加崩溃代码
-(void)testDwarf{
NSArray *arr = @[];
arr[0];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self testDwarf];
}
Xcode很详细的打印的崩溃代码位置,但是上线的项目收集的崩溃信息可没有这么详细
2.在开发模式脱去所有符号包括调试符号
项目编译改成release
,否则没有dSYM文件生成,或修改配置,如下图
再次运行项目查看看崩溃日志
Macho起始地址是0x0000000100000000
,偏移都要在这个起始地址基础上再偏移。
偏移量0x000000010526d000
要减去起始地址0x0000000100000000
得到新的偏移量0x526D000
真实的虚拟内存地址:0x000000010526f273-0x526D000 = 0x100002273
3.在dSYM文件中查找算出来的虚拟内存地址
cd到如上图目录下,执行:
dwarfdump --lookup 0x100002273 MyApp.app.dSYM
通过地址已经找到崩溃方法名称