分析iPhone崩溃日志

时间:2011-01-12 13:10:31

标签: iphone

我使用我的iPhone应用程序从客户那里得到了一个崩溃日志,并尝试从中获取符号信息,并且失败了......我在网上发现的是指令(在Mac上执行):

symbolicatecrash crash-log-file.crash symbol-file.dSYM>报告与 - symbols.crash

  • crash-log-file.crash是用户通过iTunes获取的崩溃日志,文本文件
  • symbol-file.dSYM由XCode在每次构建应用程序时创建并包含符号文件(在一系列文件夹中)

不幸的是,我的尝试都失败了: - 使用我所拥有的symbolicatecrash版本(不记得我在何处发现它),输出与输入文件相同,没有符号 - 我在磁盘上找到的另一个版本,我收到此错误消息(注意:我试图在.dSYM树中指向符号文件本身 - 仍然没有帮助):

/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash failedstart.crash ScanBizCards.app.dSYM / Contents / Resources / DWARF / ScanBizCards> crashwithsymbols

无法理解otool的输出( - >'\ / Developer \ / Platforms \ /iPhoneOS.platform \ / Developer \ / usr \ / bin \ / otool -arch armv7 -l / Users / patrickq / Projects /icr/OCR/newOCR/build/Debug-iphonesimulator/ScanBizCards.app/ScanBizCards')/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash line 301。

帮助任何人?

我甚至不介意自己为符号做数学但不知道如何打开符号文件......

帕特里克

4 个答案:

答案 0 :(得分:6)

symbolicatecrash非常错误并且尝试使用聚光灯(mdfind)做聪明的事情来找到你的二进制文件/ dsym文件。这条线是线索:

Can't understand the output from otool 
( -> '\/Developer\/Platforms\/iPhoneOS.platform\/Developer\/usr\/bin\/otool 
-arch armv7 -l 
/.../build/Debug-iphonesimulator/ScanBizCards.app/ScanBizCards') 

显然,它找到了您的一个开发构建产品(用于模拟器)并使用它来尝试表示在设备上生成的崩溃报告。当然,它失败了。

我们公司的两个不同的人发生了同样的问题。我没有调查过问题是怎么回事。我想这是非常罕见的,否则,这样一个巨大的错误就已经被修复了。目前,我只有这个非常粗略的解决方法:

  • 删除提及此可执行文件名称的所有build文件夹(在您的情况下为ScanBizCards.app
  • 从模拟器中删除应用程序(我的意思是,在各种版本的模拟器中应用程序的所有版本,例如~/Library/Application Support/iPhone Simulator/4.3~/Library/Application Support/iPhone Simulator/3.2,...)

这样您只能使用已存档的应用程序。这一次,symbolicatecrash找不到错误的版本并最终找到正确的版本。

如果我重现这个问题,我会花一些时间调试这个可怕的perl脚本。

我希望有所帮助。

答案 1 :(得分:1)

我有同样的问题,弗雷德里克指出。要更全面地解决问题,请在sub getSymbolPathFor_dsymUuid脚本中搜索symbolicatecrash,然后更改以下行:

my $cmd = "mdfind \"com_apple_xcode_dsym_uuids == $myuuid\"";

mdfind之后添加此参数:

-onlyin /path/to/your/app/bundles

并使用存储归档捆绑包的目录。这样,它总能找到您应用的正确版本。如果您想要更安全,请向下滚动一下它所在的位置:

my @spotLightSearchForExecutable = `mdfind $executable.app'; # To cover the case where the DSYM's and .app are no located in the same location.

并添加-onlyin /path/to/your/app/bundles。仅当上述行的注释symbolicatecrash无法在.DSYM所在的文件夹中找到您的.app时,才会使用此路径。希望如果你把它们存放在同一个文件夹中,那么永远不应该运行,但如果你有任何疑问,最好是安全并且也这样做。

答案 2 :(得分:0)

您似乎正在为iPhone模拟器调试符号运行symbolicatecrash,而您需要将路径传递给iPhone设备构建的符号

答案 3 :(得分:0)

如果您使用Xcode的“构建和存档”功能来分发应用程序(Apple Store或用户),您可以将崩溃日志拖到管理器中,让IDE进行符号化。

请记住,必须拥有应用和.DSYM的确切版本。重新编译应用程序会生成不同的.DSYM,但无法正常工作。