符号这篇文章中stip调试符号的时候提到了DWARF
,那么DWARF
是什么?markdown
DWARF
是一种被众多编译器和调试器使用的用于支持源代码级别调试的调试文件格式。app
dSYM
文件就是保存按DWARF
格式保存调试信息的文件。post
debug map
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
复制代码
省略中间部位截图
3d
__DWARF
段保存的是调试信息 4.生成dSYM文件。终端使用以下命令:调试
//-g1参数,在当前目录生成dSYM文件
clang -g1 test.m -o test
复制代码
5.查看dSYM文件内容。终端使用以下命令:日志
dwarfdump test.dSYM
复制代码
保存类符号的名称及地址code
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
复制代码
经过地址已经找到崩溃方法名称