iOSアプリケーションのクラッシュログを見つける方法とiOSのクラッシュログをシンボル化する方法

# 概要

あなたはXcodeに接続せずに携帯電話でアプリケーションをテストしていますか？あなたはAppleに対してバグレポートを提出していて、Appleはクラッシュログを要求しましたか？この記事では、クラッシュログをフェッチする方法をいくつかご紹介します。 

1) お使いのデバイスをXcodeに接続してデバッグする（インタラクティブ）
2) お使いのコンピューター上のクラッシュログにアクセスする（シンボル化）
3) お使いのデバイス上のクラッシュログにアクセスする（シンボル化されていない）

この記事でもシンボル化されたクラッシュログの解析方法について説明します。

シンボル化されたクラッシュログは、クラッシュの原因となった特定のコードを表示します。

App Storeのレビュー担当から提供されたログファイルを使用し、クラッシュが発生した場所を把握するときに重要となります。

4) Xcodeでクラッシュログをシンボル化する
5) `symbolicatecrash` ツールでクラッシュログをシンボル化する
6) `atos` ツールでクラッシュログをシンボル化する

既にApp Storeで公開されているアプリケーションのクラッシュログを解析する方法については、こちらをクリックして別の記事を参照してください。

# クラッシュレポートの取得方法

## デバイスをXcodeに接続する（シンボル化済み）

最も簡単な方法は、デバイスをMacBookに接続し、コンピュータに接続されたスマートフォンでアプリケーションを実行することです。

## Xcodeでクラッシュログにアクセスします（シンボル化済み）

まず、スマートフォンをコンピュータに接続します。次に、Xcodeアプリケーションを開きます。

上部にある `Window` メニューをクリックし、`Devices and Simulators` を選択します

<img width="700" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/4a830533-a85b-111e-f63b-4547f2cc29cf.png">

次に、左側で `Device` タブを選択します

<img width="200" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/523415f9-c94f-0c3a-857c-714685817042.png">

ウィンドウの右側にある `View Device Logs` をクリックします

![スクリーンショット 0002-09-18 13.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/4eaf1899-883f-3293-c415-0566a53f6c01.png)

これでログメッセージの一覧が見られるようになり、検索ボックスにアプリケーションの名前を入力することで特定のクラッシュログを探せるようになりました。また、`All Logs` ボタンをクリックしてすべてのログを閲覧することも可能です。

## デバイス上でクラッシュログ (シンボル化されていない状態) にアクセスする 

クラッシュログにはiPhoneまたはiPadから直接アクセスできます。
1. `設定` を開く
2. `プライバシー` を開く

<img width="220" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/49ac22e6-dd45-bc77-f623-adf91eaca344.png">

`解析および改善` を開く

<img width="220" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/699ddde3-7b0a-6066-75ec-b8ebe36ea2a6.png">

`解析データ` を開く

<img width="220" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/5a38047c-6eac-c85e-d34a-903bf4540489.png">

すると、全てのクラッシュログの閲覧表が表示されます。下へスクロールすると、検索バーが出てきます。そこへアプリケーション名を入力すると、そのアプリのクラッシュログのリストがみられます。

<img width="220" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/104800b7-05a7-20da-6b9a-8fc0fb93407f.png">

クリックしてログへ入ると、それをコンピューターへエアドロップできます。

# ログファイルをシンボル化

## Xcodeの中

最初に、クラッシュファイルのファイル拡張子が `.crash` になっているかどうか確認してください。もしそうなっていなければ、拡張子を  `.crash`  に変更してください。

Xcodeを開いて、`Devices and Simulators` ウィンドウを開いてください。`View Device Logs`（デバイスログを閲覧）をクリックしてください。表が完全にロードしたら、クラッシュファイルをウィンドウの左パネルへドラッグしてください。

## コマンドラインで

コマンドラインを使って各アドレスをシンボル化することも可能です

### まず、 `dSYM` ファイルを見つけます

App Storeにアップロードされているアプリの場合、Xcode の `Organizer` を開くことで `dSYM` ファイルをフェッチできます。アプリを見つけ、バージョンの上で右クリックしてください。

![スクリーンショット 0002-09-18 13.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/7b94052e-b0fc-ecf4-453b-29659f03081c.png)

これで、Xcodeのアーカイブされたファイルを Finder アプリ内で閲覧できるようになります。 そのアーカイブ上で右クリックして、`パッケージの内容を表示` をクリックしてください。

![スクリーンショット 0002-09-18 13.59.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/b254d53b-160a-c393-94a8-b2ef03301f2b.png)

これで Folder 内で `dSYM` ファイルが見られるようになります。

![スクリーンショット 0002-09-18 14.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/82bf07a7-85da-94d1-59e7-9bae35909319.png)

### dSYM ファイルの検索

ID を一致させて dSYM ファイルを検索することもできます。

最初に ID を見つけます

アプリケーションの ID はクラッシュレポートの `Binary Images` セクションで見つかります

![スクリーンショット 0002-09-18 14.21.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/2bb88152-d325-08d3-3f3b-ddc784ecde08.png)

その後、以下のコマンドを入力し、所定のUUIDのdSYMファイルを検索します。

```shell
mdfind "com_apple_xcode_dsym_uuids == <UUID>"
```

### `symbolicatecrash` ツールの利用

まず最初にファイルパスを定義します：

```shell
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
```

その後、コマンドを実行します

```shell
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -d <path_to_dsym> -o <output file> <path_to_crash_report>
```

<path_to_dsym>: あなたのdSYMファイルのファイルパス
<output file>: 出力場所
<path_to_crash_report>: オリジナルのクラッシュレポートへのファイルパス

### `atos` ツールの利用

```shell
atos -arch <binary architecture> -o <dSYM file path> -l <Load address> <Stack Address>
```

binary architecture: クラッシュレポートのバイナリイメージ `Binary Image` の一行目にあります。

![スクリーンショット 0002-09-18 14.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/c225083a-6715-a4b4-416c-443308ad0b31.png)

Load address: クラッシュレポートのバイナリイメージ `Binary Image` の一行目にあります。

![スクリーンショット 0002-09-18 14.12.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/92de6e43-819a-70eb-df16-7482f382f725.png)

Stack Address: これは、そのファイルの行に一番最初に表示されるアドレスです。

![スクリーンショット 0002-09-18 14.14.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/d5b3cad5-87b9-fb2a-ee9e-2e7785da6142.png)

従ってこの場合、実行するコマンドラインは：

```shell
atos -arch arm64 -o <dSYM file path> -l 0x10237c000 0x000000010243bd64
```

上記のコマンドの出力には、異常終了が起きた場所のコード行が表示されているはずです。

# iOS15以降のログファイル解析

iOS 15では、ログファイルを解析するための新しいツールがあります。
@am10 さんの記事を読んでみてください。

https://qiita.com/am10/items/63a4db08daf9dae3f80e#_reference-3db30099c75d3828c0e5

---

[⭐️ こちらのウェブページにアクセスすると、私の公開されているQiitaの記事のリストをカテゴリー別にご覧いただけます。](https://mszmagic.com/ioskiji/)