我的应用程序的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文件,即使它不认为它适用?
答案 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
如果第二个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来象征我的崩溃日志。
将dsym
和unsymbolicated.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"
。
注意:虽然这异常骇人,并不能保证成功,但很可能会导致使用错误的方法名称的错误符号化崩溃,但也许对您有用!