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

Ios 象征iPhone应用程序崩溃报告,ios,crash-reports,symbolicate,Ios,Crash Reports,Symbolicate,我想尝试将我的iPhone应用程序的崩溃报告符号化 我从iTunes Connect检索到了崩溃报告。我有提交到应用商店的应用程序二进制文件,还有作为构建的一部分生成的dSYM文件 我将所有这些文件放在一个目录中,该目录由spotlight索引 现在怎么办 我试着引用: symbolicatecrash crashreport.crash myApp.app.dSYM 它只输出与崩溃报告中相同的文本,而不是符号化的文本 我做错什么了吗?为了象征崩溃,Spotlight必须能够找到在您提交给Ap

我想尝试将我的iPhone应用程序的崩溃报告符号化

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

我将所有这些文件放在一个目录中,该目录由spotlight索引

现在怎么办

我试着引用:

symbolicatecrash crashreport.crash myApp.app.dSYM
它只输出与崩溃报告中相同的文本,而不是符号化的文本


我做错什么了吗?

为了象征崩溃,Spotlight必须能够找到在您提交给Apple的二进制文件生成的同时生成的.dSYM文件。由于它包含符号信息,如果它不可用,您将很倒霉。

在运行symbolicate crash之前,我还将dsym、应用程序包和崩溃日志放在同一个目录中

然后,我使用.profile中定义的此函数简化运行:

function desym
{
    /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
}
这里添加的参数可能会对您有所帮助

通过运行以下命令,您可以检查以确保spotlight“看到”您的dysm文件:

mdfind 'com_apple_xcode_dsym_uuids = *'
查找目录中的dsym

注意:从最新的Xcode开始,不再有开发人员目录。您可以在此处找到此实用程序:


/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Vers‌​ions/A/Resources/symbolicatecrash

为了让symbolicatecrash脚本正常运行,我不得不对其进行大量的黑客攻击

据我所知,目前的崩溃要求.app与.dsym位于同一目录中。它将使用.dsym查找.app,但不会使用dsym查找符号

在尝试这些修补程序之前,您应该复制一份崩溃的副本,这些修补程序将使其在dsym中显示:

在GetSymbolPathFordsymuuid函数的第212行附近

212     my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);
matchesUUID函数中第265行附近

265             return 1;

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

神奇的Xcode Organizer并没有那么神奇地象征着我的应用程序。我从苹果提交失败的应用程序中得到的崩溃报告根本没有任何符号

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

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

<>这只为我的应用程序提供了符号,而不是核心基础代码,但它比组织者给我的数字转储要好,而且足以让我找到并修复我的应用程序崩溃的情况。如果有人知道如何扩展它来获得基础符号,那将是值得赞赏的。

< P>分析苹果崩溃报告的步骤:< /P>
  • 将推送到appstore的release.app文件、发布时创建的.dSYM文件以及从APPLE收到的崩溃报告复制到一个文件夹中

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

  • 运行
    atos-arch armv7-o APPNAME.app/APPNAME MEMORY\u LOCATION\u OF\u CRASH
    。根据报告,内存位置应该是应用程序崩溃的位置

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

    这将向您显示导致崩溃的确切行、方法名称

    例如:
    [classname functionName:]-510

    象征IPA

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

    注意

    这只能在应用程序二进制文件没有删除符号的情况下工作。默认情况下,发布版本会删除这些符号。我们可以在项目构建设置“复制期间剥离调试符号”中将其更改为“否”


    更多详细信息请参见此

    这里是我在symbolicatecrash中遇到的另一个问题–它不适用于捆绑包中有空格的应用程序(即“Test App.App”)。注意:我不认为在提交时可以在其名称中包含空格,因此无论如何都应该删除这些空格,但是如果您已经有需要分析的崩溃,请将崩溃(4.3 GM)作为补丁:

    240c240
    my$cmd=“mdfind\”kMDItemContentType==com.apple.application-bundle&&kMDItemFSName='$exec\u name.app'\”;
    251c251
    my$cmd=“find\”$archive\u path/Products\”-name\“$exec\u name.app\”;
    
    在我的例子中,我将崩溃报告直接从邮件拖到组织者。出于某种原因,这阻止了事故报告被符号化(我想知道为什么)

    首先将崩溃报告复制到桌面,然后将它们从桌面拖动到管理器,这样可以正确地对它们进行符号化


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

    使用Xcode 4,任务更简单:

    • 开放式组织者
    • 单击左栏中的库|设备日志
    • 点击屏幕底部的“导入”按钮

    瞧。日志文件将为您自动导入和符号化。假设您先使用Xcode->Product->Archive归档构建。

    我在应用程序中使用Airbrake,这在远程错误记录方面做得相当好

    以下是如果回溯需要,我如何用atos来象征它们:

  • 在Xcode(4.2)中,转到组织者,右键单击来自的存档 其中.ipa文件是g
    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\"";
    
    ...
    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
    ...
    
    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
    
    /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
    
    mdfind 'com_apple_xcode_dsym_uuids = *'
    
    mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
    
    @dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
    
    mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
    
    Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
    Found executable <SOME_PATH>/example.app/example
    -- MATCH
    
    symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
    
    #!/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"
    
    header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');
    
    #!/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 ""