2014-09-20 86 views
1

我從我的Mac App Store應用程序中獲取堆棧跟蹤信息,我想閱讀該信息以幫助診斷用戶遇到的問題。我有dSYM文件和原始的存檔版本,但是我沒有完整的崩潰報告。我想知道的是堆棧跟蹤中方法的名稱(您可以在下面看到其中的兩個爲MyAppName)。我一直無法獲得lldbatos給我這個信息。這是堆棧跟蹤的樣子:從Mac應用程序的調用堆棧獲取符號名稱

0 CoreFoundation      0x00007fff92fdd25c __exceptionPreprocess + 172 
1 libobjc.A.dylib      0x00007fff918dbe75 objc_exception_throw + 43 
2 CoreFoundation      0x00007fff92ebb4f5 -[__NSArrayM objectAtIndex:] + 245 
3 MyAppName       0x0000000108e91c6b MyAppName + 126059 
4 MyAppName       0x0000000108e7556f MyAppName + 9583 
5 AppKit        0x00007fff8d883099 -[NSToolbarButton sendAction:to:] + 75 
6 AppKit        0x00007fff8d8830e8 -[NSToolbarButton sendAction] + 65 
7 AppKit        0x00007fff8d436f0c -[NSToolbarItemViewer mouseDown:] + 4897 
8 AppKit        0x00007fff8d352a58 -[NSWindow sendEvent:] + 11296 
9 AppKit        0x00007fff8d2f15d4 -[NSApplication sendEvent:] + 2021 
10 AppKit        0x00007fff8d1419f9 -[NSApplication run] + 646 
11 AppKit        0x00007fff8d12c783 NSApplicationMain + 940 
12 libdyld.dylib      0x00007fff87df35fd start + 1 
13 ???         0x0000000000000001 0x0 + 1 

要得到一個符號(比如說上面的級別3),我可以使用什麼命令?當我打電話lldb,它甚至不是清楚,如果我應該使用十六進制地址或偏移,如果是這樣的126059是3級

更新

按照atos documentation什麼,它看起來像我應該這樣調用它:

xcrun atos -arch x86_64 -o MyAppName.app/Contents/MacOS/MyAppName -l <LOADED ADDRESS> 0x0000000108e91c6b 

但是,我會用什麼作爲加載的地址?我所擁有的就是我上面粘貼的內容。無論我使用0x00000000000000010x00007fff87df35fd還是完全忽略-l,我都會得到0x0000000108e91c6b(我指定的地址)打印回標準輸出。

回答

0

在大多數轉儲堆棧跟蹤的工具(特別是CrashReporter)中,報告底部有一個部分,其中包含當前程序中加載的所有圖像,它們的UUID和它們的加載地址。您應該始終確保獲取該信息以及堆棧跟蹤,因爲這會告訴您二進制文件的加載地址,並且還會確保您具有正確版本的調試信息,因爲您可以將UUID與UUID進行匹配在dSYM或二進制文件中。

但是,您也許可以使用跡線的「符號名稱+偏移量」部分來計算加載地址。通常,最後一列是該二進制文件中距離最近未被分離的符號的回溯地址的偏移量。因此,您只需在存儲的二進制文件中找到該符號的地址,將偏移量添加到該地址,然後從上面第三列中列出的地址中減去該地址。在LLDB,你可以找到使用符號的地址:

(lldb) image lookup -n <SymbolName> 

該計算會給你從它的默認加載地址二進制的「幻燈片」。然後在您的二進制運行LLDB做:

(lldb) image load -f MyAppName -s <Calculated Slide> 

現在你可以使用從MyAppName查找地址在堆棧跟蹤:

(lldb) image lookup -va <ADDRESS> 

然而,主要的可執行文件通常完全剝離 - 因爲他們一般不要提供供系統的任何其他組件使用的符號,所以沒有剩下任何符號。在這種情況下,我猜想上面列表中的MyAppName只是二進制文件的__TEXT .__文本部分,儘管我不能100%確定這一點。無論如何,如果這是正確的,你可以通過加載在LLDB二進制和做發現部分​​的默認加載地址:

(lldb) image dump sections MyAppName 

然後做上述相同的計算。

相關問題