象徵iPhone應用崩潰報告

我正在嘗試嘗試象徵個人iPhone應用程序的崩潰報告。 php

我從iTunes Connect檢索了崩潰報告。 我有提交給App Store的應用程序二進制文件,而且有做爲生成的一部分生成的dSYM文件。 後端

我將全部這些文件放在一個由Spotlight編制索引的目錄中。 api

如今怎麼辦? xcode

我嘗試調用: bash

symbolicatecrash crashreport.crash myApp.app.dSYM

而且只會輸出崩潰報告中相同的文本,而不是符號。 服務器

難道我作錯了什麼? app


#1樓

對我有用的組合是: 函數

  1. 將dSYM文件複製到崩潰報告所在的目錄中
  2. 解壓縮包含應用程序的ipa文件(「解壓縮MyApp.ipa」)
  3. 將應用程序二進制文件從生成的爆炸有效載荷中複製到崩潰報告和符號文件所在的文件夾中(相似於「 MyApp.app/MyApp」)
  4. 從Xcode的組織器中導入或從新符號化崩潰報告

使用atos,我沒法使用崩潰報告中的地址和偏移量來解析正確的符號信息。 當我這樣作時,我看到了更有意義的東西,而且這彷佛是合法的堆棧跟蹤。 ui


#2樓

在閱讀完全部這些答案以表示崩潰日誌(並最終成功)以後,我認爲這裏有些遺漏很是重要,這些點對於肯定爲何調用symbolicatecrash不會產生符號化輸出很是重要。 this

象徵崩潰日誌時,必須將3種資產放在一塊兒:

  1. 崩潰日誌文件自己(例如example.crash ),能夠從XCode的組織者導出,也能夠從iTunes Connect接收。
  2. .app包(即example.app )自己包含屬於崩潰日誌的應用程序二進制文件。 若是您具備.ipa軟件包(即example.ipa ),則能夠經過解壓縮.ipa軟件包(即unzip example.ipa )來解壓縮.app軟件包。 而後, .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
...

在此摘錄中,崩潰日誌屬於一個名爲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

若是不存在,您能夠運行find . -name symbolicatecrash 在Xcode.app目錄中使用find . -name symbolicatecrash進行查找。

如您所見,沒有更多的參數了。 所以,腳本必須經過運行Spotlight搜索來找到應用程序二進制文件和調試符號。 它使用名爲com_apple_xcode_dsym_uuids的特定索引搜索調試符號。 您能夠本身進行此搜索:

mdfind 'com_apple_xcode_dsym_uuids = *'

分別

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

第一個Spotlight調用爲您提供了全部已索引的dSYM包,第二個爲您提供了具備特定UUID的.dSYM包。 若是Spotlight找不到您的.dSYM軟件包,則symbolicatecrash都不會。 若是您完成全部這些工做,例如在~/Desktop聚光燈的子文件夾中,則應該可以找到全部內容。

若是symbolicatecrash找到您的.dSYM軟件包,則在symbolicate.log應該有以下一行:

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

爲了找到您的.app軟件包, symbolicatecrash調用了以下所示的Spotlight搜索:

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

注意:帶符號的回溯將輸出到終端,而不是symbolicate.log


#3樓

我對這裏彷佛沒有什麼「正常工做」的事實有點脾氣暴躁,因此我作了一些調查,結果是:

設置:接收報告的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〜第202行。它彷佛沒有正確的時間戳,所以該文件最終以Xcode沒法識別的名稱「 crash」結束(它須要某些東西)。點崩潰):

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

其次,在iOS端的QuincyKit BWCrashReportTextFormatter.m〜第176行中,將@"[TODO]"更改成@"TODO"以避開壞字符。


#4樓

爲了表示崩潰,Spotlight必須可以找到在您提交給Apple的二進制文件的同時生成的.dSYM文件。 因爲它包含符號信息,所以若是不可用,您將很不走運。


#5樓

在運行符號崩潰以前,我還將dsym,應用程序捆綁包和崩潰日誌放到了同一目錄中

而後,使用在.profile中定義的此函數來簡化運行symbolicatecrash的操做:

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開始,再也不有Developer目錄。 您能夠在這裏找到此實用程序:

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

相關文章
相關標籤/搜索