符號這篇文章中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
複製代碼
經過地址已經找到崩潰方法名稱