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

經過地址已經找到崩潰方法名稱

相關文章
相關標籤/搜索