首页 文章

象征着iPhone App崩溃报告

提问于
浏览
423

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

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

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

现在怎么办?

我试过调用:

symbolicatecrash crashreport.crash myApp.app.dSYM

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

难道我做错了什么?

25 回答

  • 687

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

    UPDATED FOR XCODE 9

    • any iOS设备连接到Mac(是物理的,是的,我知道这是愚蠢的)

    • 从"Window"菜单中选择"Devices"

    • 单击左侧的设备,然后单击右侧的VIEW DEVICE LOGS

    • 等等 . 可能需要一分钟才能显示出来 . 也许做 Command-A 然后 Delete 会加速这个 .

    • Critical undocumented step: 将您从iTunesConnect获得的崩溃报告从 .txt 扩展名重命名为 .crash 扩展名

    • 将崩溃报告拖到左侧的那个区域

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

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

  • 0

    为了表示崩溃,Spotlight必须能够找到在您提交给Apple的二进制文件的同时生成的.dSYM文件 . 由于它包含符号信息,如果没有,您将无法运气 .

  • 4

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

  • 14

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

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

    $ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"
    

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

  • 114

    我喜欢使用Textwrangler来查明原始应用上传二进制拒绝中的错误 . (崩溃数据将在您的itunesConnect帐户中找到 . )使用上面的Sachin方法,我将original.crash复制到TextWrangler,然后将我创建的symbolicatecrash文件复制到另一个TextWrangler文件 . 比较两个文件精确定位差异 . symbolicatecrash文件将有差异,指出问题的文件和行号 .

  • 0

    分析来自apple的崩溃报告的步骤:

    • 复制已推送到appstore的发行版.app文件,即发布时创建的.dSYM文件,崩溃报告从APPLE接收到文件夹 .

    • OPEN终端应用程序并转到上面创建的文件夹(使用 cd 命令)

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

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

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

    例如: [classname functionName:]; -510

    Symbolicating IPA

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

    Note

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

    更多细节见post

  • 20

    就我而言,我将崩溃报告直接从Mail拖到管理器 . 出于某种原因,这可以防止崩溃报告被象征化(我很想知道原因) .

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

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

  • 163

    我更喜欢 script ,它将象征我的所有崩溃日志 .

    先决条件

    创建一个文件夹并放置4件事:

    • symbolicatecrash perl脚本 - 有许多SO答案告诉它的位置

    • 与崩溃相匹配的构建存档(来自Xcode Organizer . 简单如 Show in Finder 和复制)[我不确定这是必要的]

    • 所有 xccrashpoint 包 - (来自Xcode Organizer . Show in Finder ,您可以复制目录中的所有包,或者您想要符号化的单个xccrashpoint)

    • 将该短脚本添加到目录:

    #!/bin/sh
    
    echo "cleaning old crashes from directory"
    rm -P *.crash
    rm -P *.xccrashpoint
    rm -r allCrashes
    echo "removed!"
    echo ""
    echo "--- START ---"
    echo ""
    
    mkdir allCrashes
    mkdir symboledCrashes
    find `ls -d *.xccrashpoint` -name "*.crash" -print -exec cp {} allCrashes/ \;
    
    cd allCrashes
    for crash in *.crash; do
        ../symbolicatecrash $crash > ../symboledCrashes/V$crash
    done
    cd ..
    
    echo ""
    echo "--- DONE ---"
    echo ""
    

    剧本

    运行脚本时,您将获得2个目录 .

    • allCrashes - 来自所有 xccrashpoint 的所有崩溃都将在那里 .

    • symboledCrashes - 同样崩溃但现在包含所有符号 .

    • 在运行脚本之前,您不需要从旧的崩溃中清除目录 . 它会自动清洁 . 祝好运!

  • 7

    我们使用Google Crashlytics来监督崩溃日志,感觉非常及时,方便使用 .

    文件链接:https://docs.fabric.io/apple/crashlytics/missing-dsyms.html#missing-dsyms

    所有关于缺少dSYMs Fabric包括一个自动上传项目的dSYM的工具 . 该工具通过/ run脚本执行,该脚本在新手入门过程中添加到Run Script Build阶段 . 但是,在某些情况下,由于独特的项目配置或者您在应用中使用Bitcode而导致dSYM上传失败 . 当上传失败时,Crashlytics无法进行符号化和显示崩溃,并且您的Fabric仪表板上将显示“Missing dSYM”警报 .

    可以按照下面列出的步骤手动上传缺少的dSYM .

    注意:作为自动dSYM上传工具的替代方案,Fabric提供了一个命令行工具(upload-symbols)),可以手动配置该工具作为项目构建过程的一部分运行 . 有关配置说明,请参阅下面的upload-symbols部分 .

    ...

  • 1

    atos正在弃用,因此如果您运行的是OSX 10.9或更高版本,则可能需要运行

    xcrun atos

    警告:/ usr / bin / atos正在移动,将从未来的OS X版本中删除 . 它现在可以在Xcode开发人员工具中使用,可通过以下方式调用:xcrun atos

  • 8

    我不得不对symbolicatecrash脚本进行大量的黑客攻击,以使其正常运行 .

    就我所知,symbolicatecrash现在要求.app与.dsym在同一目录中 . 它将使用.dsym来定位.app,但它不会使用dsym来查找符号 .

    在尝试使用这些补丁之前,您应该复制一下symbolicatecrash,这将使它在dsym中显示:

    在getSymbolPathFor_dsymUuid函数的第212行附近

    212     my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);
    

    在matchesUUID函数的第265行附近

    265             return 1;
    
  • 3

    这是我对symbolicatecrash的另一个问题 - 它不适用于捆绑中有空格的应用程序(即'Test App.app') . 注意我不认为在提交时你的名字中可以有空格,所以你应该删除它们,但是如果你已经有需要分析的崩溃,那么修补symbolicatecrash(4.3 GM):

    240c240
    <         my $cmd = "mdfind \"kMDItemContentType == com.apple.application-bundle && kMDItemFSName == $exec_name.app\"";
    ---
    >         my $cmd = "mdfind \"kMDItemContentType == com.apple.application-bundle && kMDItemFSName == '$exec_name.app'\"";
    251c251
    <             my $cmd = "find \"$archive_path/Products\" -name $exec_name.app";
    ---
    >             my $cmd = "find \"$archive_path/Products\" -name \"$exec_name.app\"";
    
  • 0

    对于那些使用Airbrake的人来说,上面有一个坚实的回应,但如果没有调整它对我不起作用:

    适用于某些内存地址但不适用于其他地址,不确定原因...

    • 在桌面或任何地方创建新目录

    • 在Xcode管理器中查找有问题的存档

    • 双击以在取景器中显示

    • 双击以显示包内容

    • 将.dSYM文件和.app文件复制到新目录中

    • cd进入新目录

    • 运行此命令:atos -arch armv7 -o 'Vimeo.app' / 'Vimeo'

    • 终端将进入交互式移动

    • 粘贴到内存地址并按回车键,将输出方法名称和行号

    • 或者,输入以下命令:atos -arch armv7 -o 'Vimeo.app' / 'Vimeo'仅获取一个地址的信息

  • 1

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

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

    enter image description here

    enter image description here

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

    enter image description here

    enter image description here

    enter image description here

    enter image description here

  • 25

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

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

    function desym
    {
        /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
    }
    

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

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

    mdfind 'com_apple_xcode_dsym_uuids = *'
    

    查找目录中的dsym .

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

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

  • 0

    对我有用的组合是:

    • 将dSYM文件复制到崩溃报告所在的目录中

    • 解压缩包含应用程序的ipa文件('unzip MyApp.ipa')

    • 将应用程序二进制文件从生成的爆炸有效负载复制到与崩溃报告和符号文件相同的文件夹中(类似于"MyApp.app/MyApp")

    • 导入或重新表示来自XCode组织者的崩溃报告

    使用 atos 我无法使用崩溃报告中的地址和偏移量来解析正确的符号信息 . 当我这样做时,我看到一些更有意义的东西,它似乎是一个合法的堆栈跟踪 .

  • 0

    我发现大多数提议的替代品在最新的XCode中都不起作用(使用Xcode 10测试) . 例如,我没有运气拖放.XCR日志在Xcode - >管理器 - >设备日志 - 查看 .

    我建议使用Symbolicator工具https://github.com/agentsim/Symbolicator

    • Git克隆Symbolicator存储库并使用Xcode编译和运行

    • 复制.crash文件(ascii文件,在文件的请求中有堆栈跟踪)和.xarchive崩溃释放到同一个临时文件夹

    • 将.crash文件拖放到Dock中的Symbolicator图标

    • 在5-30秒内,符号化的崩溃文件与.crash和.xarchive在同一文件夹中生成

  • 28

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

  • 28

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

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

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

    • 在终端中,cd into the xcarchive 例如 MyCoolApp 10-27-11 1.30 PM.xcarchive

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

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

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

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

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

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

    请享用!

  • -1

    我有点脾气暴躁的事实似乎没有什么似乎“正常工作”所以我做了一些调查,结果是:

    设置:接收报告的QuincyKit后端 . 没有设置符号,因为我甚至无法弄清楚他们建议我做些什么来使它工作 .

    修复:从服务器在线下载崩溃报告 . 它们被称为'崩溃',默认情况下进入〜/ Downloads /文件夹 . 考虑到这一点,这个脚本将“做正确的事情”,崩溃报告将进入Xcode(管理器,设备日志),并将完成符号化 .

    剧本:

    #!/bin/bash
    # Copy crash reports so that they appear in device logs in Organizer in Xcode
    
    if [ ! -e ~/Downloads/crash ]; then 
       echo "Download a crash report and save it as $HOME/Downloads/crash before running this script."
       exit 1
    fi
    
    cd ~/Library/Logs/CrashReporter/MobileDevice/
    mkdir -p actx # add crash report to xcode abbreviated
    cd actx
    
    datestr=`date "+%Y-%m-%d-%H%M%S"`
    
    mv ~/Downloads/crash "actx-app_"$datestr"_actx.crash"
    

    如果您使用QuincyKit / PLCR,可以通过做两件事来自动拖放Xcode Organizer .

    首先,你必须编辑远程脚本admin / actionapi.php~line 202.它似乎没有正确的时间戳,所以文件最终以Xcode无法识别的名称'crash'(它想要的东西)点崩溃):

    header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');
    

    其次,在QuincyKit BWCrashReportTextFormatter.m~第176行的iOS端,将 @"[TODO]" 更改为 @"TODO" 以绕过坏字符 .

  • 8

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

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

    • 崩溃日志文件本身(即 example.crash ),从XCode的管理器导出或从iTunes Connect接收 .

    • .app 包(即 example.app )本身包含属于崩溃日志的应用程序二进制文件 . 如果你有一个 .ipa 包(即 example.ipa ),那么你可以通过解压缩 .ipa 包(即 unzip example.ipa )来提取 .app 包 . 之后 .app 包位于解压缩的 Payload/ 文件夹中 .

    • 包含调试符号的 .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
    ...
    

    在此提取中,崩溃日志属于名为example.app/example的应用程序二进制映像,其中包含UUID aa5e633efda8346cab92b01320043dc3 .

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

    dwarfdump --uuid example.app/example
    UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
    

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

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

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

    继续执行 symbolicatecrash 脚本:

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

    /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
    

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

    如您所见,没有给出更多参数 . 所以脚本必须找到你的通过运行聚光灯搜索来应用二进制和调试符号 . 它使用名为 com_apple_xcode_dsym_uuids 的特定索引搜索调试符号 . 你可以自己做这个搜索:

    mdfind 'com_apple_xcode_dsym_uuids = *'
    

    RESP .

    mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
    

    第一个聚光灯调用为您提供所有索引的dSYM包,第二个聚焦调用为您提供具有特定UUID的 .dSYM 包 . 如果聚光灯找不到你的 .dSYM 包,则 symbolicatecrash 也不会 . 如果你做了所有这些事情,例如在 ~/Desktop 聚光灯的子文件夹中应该能够找到所有内容 .

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

    @dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
    

    要查找 .app 包, symbolicatecrash 会调用以下聚光灯搜索:

    mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
    

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

    Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
    Found executable <SOME_PATH>/example.app/example
    -- MATCH
    

    如果 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
    

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

  • 4

    使用XCode 4,任务更简单:

    • 打开管理器,

    • 点击图书馆|设备登录左栏

    • 点击屏幕底部的"Import"按钮...

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

  • 6

    我成功了,现在我想和你们所有人分享 .

    These are following steps:

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

    Step 2: 打开Finder并转到应用程序,在那里你会找到Xcode应用程序,右键单击它并单击"Show Package Contents",然后按照这个简单的路径

    “目录 - >开发人员 - >平台 - > iPhoneOS.platform->开发人员 - >库 - > PrivateFrameworks-> DTDeviceKit.framework - >版本 - > A->资源”

    要么

    “目录 - >开发人员 - >平台 - > iPhoneOS.platform->开发人员 - >库 - > PrivateFrameworks-> DTDeviceKitBase.framework - >版本 - > A->资源”

    要么

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

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

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

    • cd / Users / mac38 / Desktop / CrashReport并按Enter按钮

    • export DEVELOPER_DIR =“/ Applications / Xcode.app / Contents / Developer”并按Enter键

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

    快乐的编码..谢谢

  • 72

    这很简单,经过大量搜索,我找到了清晰的步骤来表示整个崩溃日志文件 .

    • 复制文件夹中的.app,crash_report和DSYM文件 .

    • 用xcode连接设备

    • 然后转到窗口 - >选择设备 - >查看设备日志

    • 然后选择此设备,删除所有日志 .

    • 将您的崩溃拖放到设备日志部分 . 它会自动象征崩溃 . 只需右键单击报告并将其导出即可 .

    快乐的编码,
    Riyaz

  • 4

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

    脚步

    1.Xcode>窗口>设备 .

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

    3.选择查看设备日志 .

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

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

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

相关问题