如何手动符号化 iOS 崩溃以查看崩溃日志

27

我试图调试应用程序,但问题是我找不到这个程序。

symbolicatecrash.sh

sudo cp /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/symbolicatecrash /usr/local/bin/

这需要单独下载吗?我正在使用XCode 3.2.3。

谢谢。

6个回答

90

编辑 :: XCode 4.3

您需要按照下面的步骤进行操作,但需要注意一些例外情况。

首先,您需要修复Xcode路径。打开终端并运行以下命令:

/usr/bin/xcode-select -print-path

如果显示为“/Developer”或任何不是“/Applications/Xcode.app/Contents/Developer/”的内容,则是错误的。要修复此问题,请运行以下命令:

sudo /usr/bin/xcode-select -switch /Applications/Xcode.app/Contents/Developer/

现在您可以运行下面的所有步骤,但除了symbolicatecrash命令位于新位置(再次)。这是因为Xcode现在安装为应用程序。要从终端找到symbolicatecrash,请运行以下命令

find /Applications/Xcode.app -name symbolicatecrash -type f

这应该返回:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash

在运行symbolicatecrash之前,您可能希望前往此目录,如下所示:

cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/


原始答案 :: Xcode < 4.3

symbolicatecrash的路径

从终端使用以下命令搜索:

find /Developer -name symbolicatecrash -type f

对我来说,这返回了:

/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash

如何手动符号化崩溃日志

运行symbolicatecrash命令,将崩溃日志作为第一个参数,将dSYM文件作为第二个参数。请注意,如果您将从当前目录运行symbolicatecrash,则必须在前面加上./,例如./symbolicatecrash,除非您的PATH环境变量包括该命令所在的目录。

我首先更改到具有symbolicatecrash命令的目录(注意:对于Xcode 4.3,将不同,请参见顶部):

cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/

然后我执行了以下命令:

./symbolicatecrash /somePath/MyCrashLogFile.crash /somePath/MyAppName.app.dSYM

如何找到dSYM文件:

要获取dSYM文件,必须有用于创建崩溃构建的存档。

以下是步骤:

  1. 从组织者中右键单击(或ctrl+单击)存档,并选择“在Finder中显示”。
  2. 在Finder中,右键单击(或ctrl+单击)xcarchive文件,选择“显示包内容”。然后你会看到一个“dSYMs”文件夹。
  3. 在“dSYMs”文件夹内,您将找到“YourAppName.app.dSYM”文件,需要对文件进行符号化。

32
当我尝试运行symbolicatecrash时,出现了以下错误:Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 53。编辑后,问题得到解决:export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"。 - elsurudo
2
值得注意的是,除非您从与导致崩溃的同一.ipa文件中提取了正确的.app文件并将其与.dSYM和.crash文件放在同一个文件夹中,否则符号化将无法正常工作。我建议在您的桌面上创建一个新文件夹,并将.dSYM和.crash文件放入其中。然后通过更改名称为ApplicationName.zip并双击解压缩内容来从您的ApplicationName.ipa中提取.app文件。打开文件夹并找到其中的ApplicationName.app。将ApplicationName.app复制到您桌面上的文件夹中。现在在该文件夹中运行符号化以处理您的.crash和.dSYM文件。 - Jeremy Fox
8
在Xcode 6中,该路径为Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash - Andrew
1
您需要运行 $export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer/ 命令来解决错误:"DEVELOPER_DIR" 未定义。 - Sazzad Hissain Khan

5
在Xcode的“Product”菜单下提供了一个插件。这个插件可以通过Alcatraz package manager获取,也可以直接从github下载。
这个插件内部包含一个shell脚本,用于手动崩溃符号化的设置,它会运行以下命令:
1. 为symbolicatecrash.pl perl脚本设置别名:

alias symbolicatecrash='/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash'

2. 查找symbolicatecrash,以防别名与其不同:

find /Applications/Xcode.app -name symbolicatecrash -type f

3. 设置DEVELOPER_DIR变量:

export DEVELOPER_DIR='/Applications/Xcode.app/Contents/Developer'

4. 带有dSYM的crash可以被符号化为:

symbolicatecrash /path/to/MyApp_2012-10-01_Device.crash /path/to/MyApp.app.dSYM.


4

对于符号化(crash symbolication)日志的一种方法是在终端上运行以下命令:

xcrun atos -o MyApp.app/MyApp -arch armv7 -l 0xb7000 -f MyApp.crash

将上面命令中的示例十六进制数字(0xb700)替换为基本加载地址。基本加载地址是在“Binary Images:”后面第一条内存地址所在的行。

获取 .app 文件的方法如下:

右键点击 xcarchive 文件并选择“显示包内容”,.app 文件在 Products/Applications 目录中。


帮了我很大的忙,谢谢。Symbolicatecrash 只对我的应用程序的部分方法进行了符号化,原因不明。而 xcrun atos 显示了所有的方法。在这里,您可以看到有关 atos 的一些方面的解释:https://dev59.com/1Wsz5IYBdhLWcg3wxat3 - Petr

2

我刚刚在这里写了一篇关于调试崩溃日志的文章:http://just2us.com/2010/10/reading-iphone-crashlog/

如果将日志拖放到Xcode中已经足够满足您的目的,那么您可能不再需要使用symbolicatecrash.sh。 我正在使用3.2.4版本,也找不到该脚本。


是的,这个脚本应该不再需要了。 - Brad Larson
3
@BradLarson 原来脚本仍然是必要的。我导入了在另一台电脑上构建的存档文件,但由于某种原因,XCode无法自动为从该存档文件构建的生成版本符号化崩溃日志。 :( 然而,使用 symbolicatecrash 我仍然能够符号化这些崩溃。但我肯定更喜欢 XCode 自动符号化它,只是它并不总是这样。 - Sam

2

正如苹果公司所解释的那样,Xcode会尝试自动符号化。 它使用symbolicatecrash和spotlight来完成这个过程。但是,如果应用程序没有在本地构建或已被删除,那么必要的.app和.dsym文件将不可用。

因此,请保留发布版本的dsym文件和应用程序。构建工具通常会将.dsym文件压缩为.dsym.zip,并将.app打包为.ipa。您可以解压缩它们并将.app和.dsym复制到同一个文件夹中。然后,Xcode就能够使用spotlight找到它们了。


1

这里是我使用的简单方法:

  1. 打开Xcode 6
  2. 连接您的开发设备
  3. 在Xcode中,转到“窗口”>“设备”>选择您的设备
  4. 按“查看设备日志”
  5. 将您的报告拖入窗口以查看它

“View Device Logs”在Mac设备上不存在,那么如何使用symbolicate查看OSX应用程序的崩溃日志? - OpenThread

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接