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

Posted

技术标签:

【中文标题】强制 symbolicatecrash 使用特定的 .app 和 .dSYM 文件?【英文标题】:Force symbolicatecrash to use a specific .app and .dSYM file? 【发布时间】:2011-10-03 02:25:23 【问题描述】:

我的应用程序的临时版本中有一个 .crash 日志,但 symbolicatecrash 拒绝符号化。在苹果破坏 XCode 3.2.6 中的脚本后,我已经在 symbolicatecrash 中添加了applied the .patch to remove the 'die' command。 Symbolicatecrash 曾为其他崩溃日志工作,但拒绝符号化这个日志。我的临时应用程序已构建并存储在“归档应用程序”中,因此 XCode 没有理由找不到它。我什至在 .crash 日志旁边复制了 .app 和 .dSYM 文件,没有骰子。

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

【问题讨论】:

【参考方案1】:

原来我不小心删除了与崩溃日志相关的构建。 symbolicatecrash 使用以下逻辑来判断是否存在与崩溃日志相关的符号:

每个崩溃日志的底部都有一个二进制图像列表。你的排在第一位。有一个与您的二进制图像相关联的 guid。例如:

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

相关的guid是:a95274a309d73458a40cb5a6fd317a1c

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

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

A95274A3-09D7-3458-A40C-B5A6FD317A1C

只要第二个 GUID 与 .crash 文件中的 guid 匹配,symbolicate crash 就能找到并进行符号化。如果它们不匹配,那就是错误的二进制文件。

干杯, 埃里克

【讨论】:

我没有看到任何 UUID 附加到我在 xcode 4 中创建的 dSYM 包。这仍然是苹果的做法吗? 我的 dSYM 文件仅在 UDID 上列出(与崩溃日志中的 UUID 匹配)。第一个 dSYM UUID 应该是什么? 对于通用(armv6 和 armv7)应用程序,第一个 UUID 用于 armv6 二进制文件,第二个 UUID 用于 armv7 文件。【参考方案2】:

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

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

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

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

这主要是推论,但似乎很有可能。

【讨论】:

【参考方案3】:

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

最近我有一个临时构建的崩溃日志。 XCode 拒绝符号化。我有一个几个小时前的存档版本,我想使用我的存档版本强制进行符号化。这是我的做法:

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 环境变量设置为:

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

请注意,在较新版本的 XCode 中,符号崩溃的路径更改为:

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

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

【讨论】:

Xcode 5 截至今天:我在那里找不到 symbolicatecrash 二进制文件。我在这里找到了它:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash 感谢***.com/a/8648232/129202 根据您的评论更新了路径。【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

我已经能够通过将 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"

注意:虽然这非常hacky并且不能保证成功,并且很可能会导致错误符号化的崩溃以及无意义的方法名称,但它可能对你有用!

【讨论】:

以上是关于强制 symbolicatecrash 使用特定的 .app 和 .dSYM 文件?的主要内容,如果未能解决你的问题,请参考以下文章

symbolicatecrash 使用方法

使用symbolicatecrash工具符号化Crash日志

无法使用 symbolicatecrash 将地址转换为符号(XCode 4.0.2 - 目标设备 iPad)

symbolicatecrash 找不到任何符号

在 ./symbolicatecrash 第 115 行的 macosx SDK 或任何后备 SDK 中找不到名为“otool”的工具

Xcode 8 中的 symbolicatecrash 位于何处?