crash log 解析方法
tans-Mac-mini:4.3-4.6Crash tangaowen$ dwarfdump --lookup 0x00097a87 --arch armv7 XXX.app.dSYM
2. 使用 atos命令 ,首先需要進入dSYM所在目錄
XXX 0x00075754 0x53000 + 141140
tans-Mac-mini:4.3-4.6Crash tangaowen$ atos -arch armv7 -o XXX -l 0x53000 0x00075754
其中 XXX是 包名, 從dSYM 包裡面copy出來的,不是 app檔案
如果在編譯的時候使用了 PIE 開關,就會每次載入的地址不一樣。也就是 Link 下面的Don’t Create Position Independent Executables
ASLR 技術Address space layout randomization
不管是方法1,還是方法2, 都需要使用一個公式:
symbol address = slide + stack address - load address
這個公式中 symbol address 是最終用來符號化的地址, slide 就是上面獲得的 dSYM 預設的載入地址,stack address就是崩潰堆疊裡面的地址, load address是 模組載入到記憶體中的起始地址,一般是Binary Image欄位 的第一行 的 最前面的那個地址。
(1) 獲取 slide
方法1: andys-Mac-mini:4.3-4.6Crash tangaowen$ otool -arch armv7 -l ZPController
方法2: andys-Mac-mini:DWARF tangaowen$ otool -arch armv7 -l "ZPController" | grep -B 3 -A 8 -m 2 "__TEXT"
獲取模組載入地址如下:
segname __TEXT
vmaddr 0x00004000
vmsize 0x003fc000
地址是 0x4000
(2) 獲取 stack address
就是 堆疊trace 行首的地址
比如: 8 - 8 ZPController 0x00154a87 main + 98
就是 0x00154a87
(3) Binary Image欄位的 第一行 行首的 地址
比如:
Binary Images:
0x53000 - 0x44efff ZPController armv7 <3c3c3bd7371333cea172602c1c718990> /var/mobile/Containers/Bundle/Application/23BF52E5-9C5E-43DC-B05E-96A02FEA9CCD/ZPController.app/ZPController
0x1fee7000 - 0x1ff0afff dyld armv7s <7216b86d38393128b0da3b7109d30710> /usr/lib/dyld
0x20993000 - 0x20afffff AVFoundation armv7s <23a20af23f733b39b5c87059c080f9f7> /System/Library/Frameworks/AVFoundation.framework/AVFoundation
那就是 0x53000