環境
- Xcode 12.5.1
- iOS 14.6
- iPhone 8
事前準備
- ipsファイルを取得するための実機を用意
- エラー発生用testアプリを作成
- 今回は画面にUIButtonを配置し、押すと
fatalError()
を実行するようにした
- 今回は画面にUIButtonを配置し、押すと
ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBAction func didTapErrorButton(_ sender: UIButton) {
fatalError("an error occurs")
}
}
- testアプリをアーカイブ、AdHoc配信のipaを作成し、実機にインストール
- 今回はApple Configurator 2を使用し、インストールした
手順
1. testアプリでエラーを発生させる
2. 設定アプリ
>プライバシー
>解析および改善
>解析データ
から対象のipsファイル
を取得
- ips一覧の画面を上にスライドすると検索ボックスが出てくるので、testアプリのプロジェクト名を入力すると対象のipsを見つけやすい
- 対象ipsのテーブルセルを選択し、右上に共有アイコンからAirDropなどでipsファイルを取得できる
3. XcodeのアプリケーションメニューWindow
>Organizer
から対象のアーカイブを右クリック。 Show in finder
しxcarchive
ファイルを確認する
4. 対象のxcarive
ファイルを右クリック、パッケージの内容を表示
を選択する
5. 以下のファイルを取得
- dSYMsフォルダの
dSYM
ファイル- シンボル化対象のipsファイルと同一のビルドUUIDを持つdSYMファイルを取得する必要がある。ipsファイル内に記載された
slice_uuid
の値と以下のコマンドから出力したdSYMファイルのUUIDが一致することを確認する。
- シンボル化対象のipsファイルと同一のビルドUUIDを持つdSYMファイルを取得する必要がある。ipsファイル内に記載された
xcrun dwarfdump --uuid {対象のdSYMファイル}/Contents/Resources/DWARF/{testアプリのproject名}
-
BCSymbolMaps
フォルダのbcsymbolmap
ファイル- このファイルはiOSアプリのビットコードを有効にしている場合に必要。今回はビットコード有効の前提で進める
6. 以下のコマンドを実行し、dSYMファイルの難読化を解除する
dsymutil --symbol-map bcsymbolmapファイルへのパス dSYMファイルへのパス
7. 以下のコマンドを実行し、シンボル化に必要な環境変数を設定
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
8. 以下のコマンドを実行し、ipsファイルをシンボル化する
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash {対象のipsファイルのパス} {対象のdSYMのパス}
結果
ipsファイルのスタックトレースにエラーが発生したclass名/fucn名が表示される
シンボル化後のipsファイルスタックトレース抜粋
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libswiftCore.dylib 0x00000001b02cc398 _assertionFailure+ 201624 (_:_:file:line:flags:) + 1504
1 libswiftCore.dylib 0x00000001b02cc398 _assertionFailure+ 201624 (_:_:file:line:flags:) + 1504
2 test 0x0000000104b3996c @objc ViewController.didTapErrorButton(_:) + 22892 (<compiler-generated>:14)
3 UIKitCore 0x00000001af1e5ca4 -[UIApplication sendAction:to:from:forEvent:] + 96