象征性iPhone应用程序崩溃报告

Jas*_*ien 429 crash-reports symbolicate ios

我想试着象征我的iPhone应用程序的崩溃报告.

我从iTunes Connect检索了崩溃报告.我有我提交到App Store的应用程序二进制文件,我有作为构建的一部分生成的dSYM文件.

我将所有这些文件放在一个由聚光灯索引的目录中.

现在怎么办?

我试过调用:

symbolicatecrash crashreport.crash myApp.app.dSYM
Run Code Online (Sandbox Code Playgroud)

它只是输出崩溃报告中的相同文本,而不是符号化.

难道我做错了什么?

Nav*_*han 689

从苹果分析崩溃报告的步骤:

  1. 将发布的.app文件复制到appstore,发布时创建的.dSYM文件,崩溃报告从APPLE接收到文件夹.

  2. 打开终端应用程序并转到上面创建的文件夹(使用cd命令)

  3. atos -arch armv7 -o APPNAME.app/APPNAME MEMORY_LOCATION_OF_CRASH.内存位置应该是应用程序根据报告崩溃的位置.

例如: atos -arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508

这将显示导致崩溃的确切行,方法名称.

例如: [classname functionName:]; -510

象征性的IPA

如果我们使用IPA进行符号化 - 只需使用.zip重命名扩展名.ipa,然后将其解压缩,然后我们就可以得到一个包含app的Payload文件夹.在这种情况下,我们不需要.dSYM文件.

注意

这只有在应用程序二进制文件没有剥离符号时才有效.默认情况下,发布版本剥离了符号.我们可以在项目构建设置"将复制期间的调试符号"更改为NO.

更多细节见这篇文章

  • 这个答案存在多个问题:1.只有在应用程序二进制文件没有剥离符号时才能使用.默认情况下,发布版本会将它们剥离.2.即使符号可用,它也永远不会显示行号.只有象征dSYM才能提供.3.您不能简单地使用堆栈跟踪中显示的内存地址,地址必须针对应用程序加载到的起始内存地址进行规范化.更多细节见这个答案:http://stackoverflow.com/questions/13574933/ios-crash-reports-atos-not-working-as-expected/13576028#13576028 (42认同)
  • 只是给@NaveenShan回答的一个提示,一个真实世界的例子可以做到这一点`atos -o myApp.app/Contents/MacOS/myApp 0x0000000100001f2c`然后你得到` - [HUDWindow sizesHUDBackground](在myApp中)+ 1197` (12认同)
  • @OscarGoldman第二个地址例如: - 在0x332da010 0x332d9000 + 4112中.使用0x332d9000. (7认同)
  • 此外,如果在没有地址的情况下使用,则允许您通过逐个提交来分析多个位置. (4认同)
  • 但是你使用哪个地址?每个函数后,日志有两列地址,第二列有+和某种偏移量.像0x332da010 0x332d9000 + 4112. (3认同)
  • @Oscar你必须使用第一个数字,第二个数字是基地址+偏移量(十进制)。事实上,我有这个数字 com.myApp 0x000000010001dc66 0x100000000 + 121958,如果你将 121958 转换为十进制,它就是 1dc66。顺便说一句,如果您进一步查看日志到二进制图像部分,在我的例子中,将会有 0x100000000 - 0x100244ff7 +com.myApp 指示属于我的应用程序的地址范围。 (2认同)

And*_*ber 173

在这里阅读所有这些答案以便表示崩溃日志(并最终成功)后,我认为这里缺少一些非常重要的点,以确定为什么symbolicatecrash的调用不会产生符号化输出.

在表示崩溃日志时,有3个资产必须组合在一起:

  1. 崩溃日志文件本身(即example.crash),从XCode的组织者导出或从iTunes Connect接收.
  2. .app包(即example.app本身包含属于崩溃日志应用程序二进制).如果您有一个.ipa包(即example.ipa),那么您可以.app通过解压缩.ipa包(即unzip example.ipa)来提取包.然后,.app程序包驻留在解压缩的Payload/文件夹中.
  3. .dSYM包含调试符号的包(即example.app.dSYM)

在开始符号化之前,您应该检查所有这些工件是否匹配,这意味着崩溃日志属于您拥有的二进制文件,并且调试符号是在构建该二进制文件期间生成的符号.

每个二进制文件都由UUID引用,可以在崩溃日志文件中看到:

...
Binary Images:
0xe1000 -    0x1f0fff +example armv7  <aa5e633efda8346cab92b01320043dc3> /var/mobile/Applications/9FB5D11F-42C0-42CA-A336-4B99FF97708F/example.app/example
0x2febf000 - 0x2fedffff  dyld armv7s  <4047d926f58e36b98da92ab7a93a8aaf> /usr/lib/dyld
...
Run Code Online (Sandbox Code Playgroud)

在此提取中,崩溃日志属于具有UUID的名为example.app/example的app二进制映像aa5e633efda8346cab92b01320043dc3.

您可以使用dwarfdump检查二进制包的UUID:

dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Run Code Online (Sandbox Code Playgroud)

之后,您应该检查您的调试符号是否也属于该二进制文件:

dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
Run Code Online (Sandbox Code Playgroud)

在此示例中,所有资源都组合在一起,您应该能够表示堆栈跟踪.

继续执行symbolicatecrash脚本:

在Xcode 8.3中,您应该能够通过调用脚本

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
Run Code Online (Sandbox Code Playgroud)

如果不存在,您可以find . -name symbolicatecrash在Xcode.app目录中运行以查找它.

如您所见,没有给出更多参数.因此,脚本必须通过运行聚光灯搜索来查找应用程序二进制文件和调试符号.它使用调用的特定索引搜索调试符号com_apple_xcode_dsym_uuids.您可以自己进行搜索:

mdfind 'com_apple_xcode_dsym_uuids = *'
Run Code Online (Sandbox Code Playgroud)

RESP.

mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
Run Code Online (Sandbox Code Playgroud)

第一个聚光灯调用为您提供所有索引的dSYM包,第二个聚光灯调用为您.dSYM提供具有特定UUID 的包.如果聚光灯找不到您的.dSYM包装,那么symbolicatecrash两者都不会.如果你做所有这些东西,例如在你的~/Desktop聚光灯的子文件夹中应该能够找到所有东西.

如果symbolicatecrash找到你的.dSYM包,那么应该有如下所示的行symbolicate.log:

@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
Run Code Online (Sandbox Code Playgroud)

要查找您的.app包,可以通过以下方式调用以下聚光灯搜索symbolicatecrash:

mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Run Code Online (Sandbox Code Playgroud)

如果symbolicatecrash找到你的.app包,那么应该有以下摘录symbolicate.log:

Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
Run Code Online (Sandbox Code Playgroud)

如果找到所有这些资源symbolicatecrash,则应打印出崩溃日志的符号化版本.

如果没有,您可以直接传入dSYM和.app文件.

symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
Run Code Online (Sandbox Code Playgroud)

注意:符号化的回溯将输出到终端,而不是symbolicate.log.

  • 这是一个很好的解释,应该是IMO的最佳答案,谢谢.请注意,如果脚本抱怨它,您可能必须设置`DEVELOPER_DIR`环境变量:``export DEVELOPER_DIR =`xcode-select --print-path```.我把这行添加到我的`〜/ .bash_profile`中.请参见http://stackoverflow.com/q/11682789/350761 (28认同)
  • 我可以找到所有文件,但是我得到了这个,并且没有符号输出“/usr/bin/symbolicatecrash 第 921 行的 testlog.crash 中没有崩溃报告版本。” (4认同)

Ala*_*ers 116

使用最新版本的Xcode(3.2.2),您可以将任何崩溃报告拖放到Xcode Organizer的"设备日志"部分,它们将自动通过符号表示.我认为如果你使用Build&Archive构建该版本的应用程序(也是Xcode 3.2.2的一部分),这种方法效果最好

  • 在全新安装中,这根本不适用于Xcode4.似乎是一个新的bug :( (3认同)
  • 使用iTunes Connect下载的崩溃报告,无法为我工作. (3认同)
  • 这个技巧适用于Xcode 4.2.将崩溃日志放在管理器的设备日志中.重新启动管理器将获得符号化的崩溃日志!谢谢. (2认同)
  • 当我从另一台计算机导入存档文件以获取崩溃日志时,这对我无效.:(因此我必须手动符号化文件.你可以在这里找到如何进行符号化的步骤:[iPhone SDK:symbolicatecrash.sh位于哪里?](http://stackoverflow.com/a/8648232/ 590956) (2认同)

Sac*_*hin 72

我使用以下步骤成功完成了这项工作.

步骤1:在桌面上创建一个文件夹,我将其命名为"CrashReport"并将三个文件("MYApp.app","MyApp.app.dSYM","MYApp_2013-07-18.crash")放入其中.

第2步:打开Finder并转到应用程序,在那里你会找到Xcode应用程序,右键单击它并单击"显示包内容",然后按照这个简单的路径."目录 - >开发人员 - >平台 - > iPhoneOS.platform->开发人员- > - > PrivateFrameworks- > DTDeviceKit.framework - >版本 - > A->资源"

要么

"目录 - >开发人员 - >平台 - > iPhoneOS.platform-> Developer-> Library-> PrivateFrameworks- > DTDeviceKitBase.framework - > Versions-> A-> Resources"

要么

对于Xcode 6及更高版本,路径为Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

如果找到"symbolicatecrash"文件,请将其复制并粘贴到"CrashReport"文件夹中.

第3步:启动终端,运行这3个命令

  1. cd/Users/mac38/Desktop/CrashReport并按Enter按钮

  2. 导出DEVELOPER_DIR ="/ Applications/Xcode.app/Contents/Developer"并按Enter键

  3. ./symbolicatecrash -A -v MYApp_2013-07-18.crash MyApp.app.dSYM并按Enter Enter it Done ..(注意:6.4或更高版本的版本没有-A选项 - 只需将其保留).

  • 对于DTServiceKit,请查看Applications/Xcode.app/Contents/SharedFrameworks (3认同)
  • 谢谢...截至2015年4月9日,这对我来说完美无缺.有一件事,就是我为symbolicatecrash得到了'Unknown选项:A`,但无论如何都要运行 (3认同)

Wil*_*ken 30

使用XCode自动符号化崩溃报告的步骤:

更新XCODE 9

  1. 任何 iOS设备连接到您的Mac(是物理的,是的,我知道这是愚蠢的)

  2. 从"窗口"菜单中选择"设备" 在此输入图像描述

  3. 单击左侧的设备,然后单击右侧的VIEW DEVICE LOGS 在此输入图像描述

  4. 等待.可能需要一分钟才能显示出来.也许这样做Command-A,然后Delete将加速此.

  5. 严重未记录的步骤:将从iTunesConnect获得的崩溃报告从.txt扩展.crash名重命名为扩展名

  6. 将崩溃报告拖到左侧的那个区域 在此输入图像描述

然后Xcode将表示崩溃报告并显示结果.

资料来源:https://developer.apple.com/library/ios/technotes/tn2151/_index.html

  • 谢谢,我现在正在添加图片.还包括SUPER UNDOCUMENTED步骤.我想要制作一个红色文本的git并将其拼接在那里,这样才能真正脱颖而出.然后我就不再考虑那个了. (2认同)

Ken*_*ner 28

在运行符号化崩溃之前,我还将dsym,app bundle和crash log放在同一目录中

然后我使用我的.profile中定义的这个函数来简化运行symbolicatecrash:

function desym
{
    /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
}
Run Code Online (Sandbox Code Playgroud)

那里添加的论据可能对你有帮助.

您可以通过运行命令来检查以确保聚光灯"看到"您的dysm文件:

mdfind 'com_apple_xcode_dsym_uuids = *'
Run Code Online (Sandbox Code Playgroud)

查找目录中的dsym.

注意:从最新的Xcode开始,不再有Developer目录.你可以在这里找到这个工具:

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Vers离子/ A /资源/ symbolicatecrash


ave*_*dev 28

我在我的应用程序中使用Airbrake,它在远程错误记录方面做得相当不错.

如果回溯需要它,我就用atos来表示它们:

  1. 在Xcode(4.2)中,转到组织者,右键单击生成.ipa文件的存档.

  2. 在终端中,例如进入xcarchiveMyCoolApp 10-27-11 1.30 PM.xcarchive

  3. 输入以下内容atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp' (不要忘记单引号)

  4. 我没有在该电话中包含我的符号.你得到的是空行上的块光标.

  5. 然后我将符号代码复制/粘贴到该块光标处,然后按Enter键.你会看到类似的东西:

    -[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34)

  6. 你回到了一个块光标,你可以粘贴其他符号.

能够通过你的回溯一个项目而无需重新进入第一位是一个很好的节省时间.

请享用!


Adi*_*wal 20

只是xcode 6.1.1的简单和更新的答案.

脚步

1.Xcode>窗口>设备.

2.从"设备"部分下的设备列表中选择设备.

3.选择查看设备日志.

4.在All Logs部分下,您可以直接拖放report.crash

5.Xcode会自动为您报告崩溃报告.

6.您可以通过将其日期/时间与崩溃报告中提到的日期/时间相匹配来查找符号化崩溃报告.

  • 我从Apple解决方案中心下载的崩溃报告通常具有.txt的扩展名.请记住将它们重命名为.crash,否则设备日志可能会拒绝添加它们.适用于我目前的XCode 6.3.1 (3认同)
  • 这是Apple的官方程序.应该是答案.Apple链接:[技术说明TN2151:了解和分析iOS应用程序崩溃报告](https://developer.apple.com/library/ios/technotes/tn2151/_index.html) (3认同)

Sam*_*m B 14

虽然我已经开发了几年的应用程序,这是我第一次调试二进制文件,我觉得这是一个完整的NOOB,可以找出所有文件的位置,即*.app*.dSYM和崩溃日志在哪里?我必须阅读多个帖子才能弄明白.图片胜过千言万语,我希望此帖可以帮助其他人.

1-首先转到itunesconnect并下载崩溃日志.注意:在大多数情况下,您可能会收到"提交的报告太少而无法显示报告".基本上没有足够的用户向Apple提交崩溃日志报告,在这种情况下,您无法做任何事情.

在此输入图像描述

在此输入图像描述

2-现在,如果你没有更改代码,因为你已将二进制文件提交给Apple,然后为该项目启动Xcode并再次执行Product - > Archive.否则,只需找到您最新提交的二进制文件并右键单击它.

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述


Séb*_*acq 8

使用XCode 4,任务更简单:

  • 打开组织者,
  • 点击图书馆| 设备登录左栏
  • 点击屏幕底部的"导入"按钮...

瞧.日志文件将自动导入并符号化.如果您使用XCode - >产品 - >存档首先存档构建


cbe*_*ley 8

在XCode 4.2.1中,打开Organizer,然后转到Library/Device Logs并将.crash文件拖到崩溃日志列表中.几秒钟后它会象征着你.请注意,您必须使用与原始构建存档相同的XCode实例(即构建的存档必须存在于管理器中).


And*_*ewS 7

Magical XCode Organizer对于象征我的应用程序并不神奇.对于我从Apple提交的失败申请中获得的崩溃报告,我根本没有任何符号.

我尝试使用命令行,将崩溃报告放在.app文件(我提交给商店)和.dSYM文件所在的文件夹中:

$ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"
Run Code Online (Sandbox Code Playgroud)

这只为我的应用程序而不是核心基础代码提供了符号,但它比组织者给我的数字转储更好,并且足以让我找到并修复我的应用程序所具有的崩溃.如果有人知道如何扩展它以获得基金会符号,将不胜感激.


sam*_*tte 6

在我的情况下,我将崩溃报告直接从Mail拖到管理器.出于某种原因,这阻止了崩溃报告的象征性(我很想知道原因).

首先将崩溃报告复制到桌面,然后将它们从那里拖动到管理器,使它们符号化正确.

非常具体的情况,我知道.但我想我会分享以防万一.


归档时间:

查看次数:

239211 次

最近记录:

6 年,1 月 前