强制symbolicatecrash使用特定的.app和.dSYM文件?

时间:2011-07-11 19:56:41

标签: iphone xcode symbols symbolicatecrash

我的应用程序的ad-hoc版本中有一个.crash日志,其符号表示拒绝符号化。苹果在XCode 3.2.6中打破脚本后,我已经在symbolicatecrash中applied the .patch to remove the 'die' command。 Symbolicatecrash已经为其他崩溃日志工作,但拒绝象征这一个。我的ad hoc应用程序已经构建并存储在" Archived Applications"中,因此XCode没有理由不能找到它。我甚至复制了.crash日志旁边的.app和.dSYM文件,没有骰子。

有没有办法可以强制symobolicatecrash使用特定的.app和.dsym文件,即使它不认为它适用?

5 个答案:

答案 0 :(得分:10)

原来我意外删除了与崩溃日志关联的构建。 symbolicatecrash使用以下逻辑来确定是否存在与崩溃日志关联的符号:

每个崩溃日志的底部都是二进制映像列表。你的名单首先列出。你的二进制图像有一个guid。例如:

0x1000 -   0x2befff +MyApp armv7  <a95274a309d73458a40cb5a6fd317a1c> /var/mobile/Applications/91884634-DA1A-4BDB-9E1E-6F487D8F25D7/MyApp.app/MyApp

相关指南是:a95274a309d73458a40cb5a6fd317a1c

接下来使用工具mdfind,它查看与文件系统中的文件相关联的元数据,以获取该GUID的大写和带连字符的形式。

从存档的应用程序中,如果单击MyApp.app.dSY,然后单击获取信息,然后显示更多信息,您将看到列出的dSYM UUID和两个GUID。第二个GUID是相关的。它将是以下形式:

A95274A3-09D7-3458-A40C-B5A6FD317A1C

enter image description here

如果第二个GUID与.crash文件中的guid匹配,则symbolicate crash将能够查找和符号化。如果他们不匹配,那就是错误的二进制文件。

干杯, 埃里克

答案 1 :(得分:5)

确定现在这个答案是最新的XCode 5.1.1所需要的:

最近我从ad-hoc构建中获得了崩溃日志。 XCode拒绝Symbolicate。我有几个小时的存档版本,我想使用我的存档版本强制进行符号化。我是这样做的:

1)首先,我打开了一个终端窗口,然后转到包含我的存档的目录。我运行了这个命令:

xcrun dwarfdump --uuid Example.app/Example | tr '[:upper:]' '[:lower:]' | tr -d '-'

这取出了归档版本的dsym_uuid。 tr命令将guid从带有破折号的大写guid转换为没有破折号的小写guid

2)我进入了.crash文件并将崩溃日志中与我的二进制文件相关联的guid更改为与我机器上的xcdarchive相关联的guid

例如,来自

   0x80000 -   0x49efff +MyApp armv7  <aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> /var/mobile/Applications/DC23BDC0-75E3-4DCA-8AC3-099889CE22E0/MyApp.app/MyApp

   0x80000 -   0x49efff +MyApp armv7  <bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb> /var/mobile/Applications/DC23BDC0-75E3-4DCA-8AC3-099889CE22E0/MyApp.app/MyApp

3)从终端,我将DEVELOPER_DIR环境var设置为:

export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer

4)最后,我跑了一个命令的野兽:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash -v MyApp.crash /Users/me/Library/Developer/Xcode/Archives/2013-05-31/MyApp\ 5-31-13\ 7.00\ PM.xcarchive/Products/Applications/MyApp.app

请注意,symbolicatecrash的路径在较新版本的XCode中更改为:

 /Applications/Xcode6.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

此命令使用您拥有的.crash文件对您的存档运行symbolicatecrash

答案 2 :(得分:2)

可能有所帮助的一些额外信息。

我列出了两个UUID,我的第一个与崩溃日志中的一个匹配,而不是第二个。然而,我的崩溃来自运行ARM6的设备,而OP来自运行ARM7的设备

因此我推断出每个UUID都与架构相匹配,如果你为ARM6和ARM7构建并且崩溃来自运行ARM6的设备,那么你需要匹配第一个UUID,如果它运行的是ARM7你需要第二。

如果你只有一个UUID,我想你可能只为一个架构而构建。

这主要是演绎,但似乎很可能。

答案 3 :(得分:0)

这里描述了一个用于提取构建UUID的新过程:

https://developer.apple.com/library/ios/qa/qa1765/_index.html

现在这是运行以提取构建UUID的神奇命令:

xcrun dwarfdump --uuid Example.app/Example | tr '[:upper:]' '[:lower:]' | tr -d '-'

答案 4 :(得分:0)

通过将dSYM UUID覆盖为预期的崩溃日志的UUID,我已经能够强制symbolicatecrash来象征我的崩溃日志。

dsymunsymbolicated.crash放在同一文件夹中。

以详细模式运行./symbolicatecrash

./symbolicatecrash unsymbolicated.crash > symbolicated.crash -d ./MyApp.app.dSYM/ -v 

滚动到底部并找到崩溃日志的预期UUID:

Did not find dsym for db3e90fa8b6d462c9d65049ab1f22ea4
-- [db3e90fa8b6d462c9d65049ab1f22ea4] NO MATCH (spotlight)

在Finder中,右键单击.dsym文件,然后单击“更多信息”部分标题下的“获取信息”,您将拥有dSYM UUIDs:属性。将此值复制到剪贴板。

使用十六进制编辑器(我从App Store使用iHex)打开MyApp.dysm/Contents/Resources/DWARF/MyApp,然后CMD + F复制复制的UUID。

在此示例中,用预期的预期UUID替换该UUID,我将其替换为"db3e90fa8b6d462c9d65049ab1f22ea4"

注意:虽然这异常骇人,并不能保证成功,但很可能会导致使用错误的方法名称的错误符号化崩溃,但也许对您有用!