1. 程式人生 > >crash log 解析方法

crash log 解析方法

1.  使用 dwarfdump 命令 ,需要首先進入 dSYM所在目錄

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