2014-09-20 95 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 

然后做上述相同的计算。

相关问题