Xcodeでデバッグしよう（入門：ブレークポイント、ウォッチポイント、LLDB、、、）

## 対象読者
* Xcode開発🔰入門者🔰
* 「デバッグってなに?」「ブレークポイントっておいしいの？」な人

　デバッグは、プログラムのミスを見つける作業のこと。
本稿では、Xcodeを使う際に効率的にデバッグする方法をお伝えします✌️

　実務経験を積まれている方は「知ってる！」と思うので、読まなくて大丈夫です。
（記事のアラ探しお願いします🙏笑）

## 環境
今回載せている結果の実行環境を記載します。
|||
|-|-|
|macOS Catalina|10.15.5|
|Xcode|11.5|

## 本稿を書いた理由
　デバッグ方法を知っているのと知らないのでは、今後の開発パフォーマンス（主に開発時間）に大きく影響すると思うから。今回紹介するのは基本中の基本ですが、知らない方もいると思います。そういった方のお役に立てれば幸いです👌

## 内容
* ブレークポイント
* ウォッチポイント
* LLDBを使う
* Viewの重なりを見る
* まとめ

今回は、XcodeでiOSアプリを作成する場合を例に進めます。

　「iOSアプリ？」「どう始めるの？」

という方は、次のように進めてみてください。
新規プロジェクト作成画面で、下のようにiOS、SingleViewAppを選択し、Next。プロジェクト名や保存場所はよしなにどうぞ。
<img width="718" alt="スクリーンショット 2020-08-07 21.46.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/af924407-5fa2-4184-2680-0214f280e8ec.png">
そうしてできたアプリを動かす（実行する）には、画面左上の▶︎ボタン、または```command + R```キーを押下しましょう。
この時、iPhoneのシミュレータを選択しておきましょう。
下の画像では```iPhone SE (2nd generation)```が選択されてますね。
<img width="460" alt="スクリーンショット 2020-08-07 21.54.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/99831fa7-3a13-7911-9544-888d7dd74c62.png">

＊今回はあくまでデバッグの仕方の説明です。以降、<font color="Red">アプリの説明やコードの説明は省略させていただきます</font>。

### ブレークポイント
　ブレークポイントを付けて実行することで、その行で処理を止めることができます。
下図のように、エディタの左の行番号をクリックすると、ブレークポイントができます。

もし、行番が表示されてなかったら、設定画面>TextEditingでShow:項目のLine numbersにチェックを入れましょう。設定画面は```command + ,```で開けます。
<img width="464" alt="スクリーンショット 2020-08-07 21.43.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/abde8392-0d8f-f63e-85e0-f2bb71949bea.png">
　上のように```viewDidLoad()```の中で、ブレークポイント前後に```print("〜")```を記述してみましょう。

　実行すると、下のようになります。ブレークポイントのある行で処理が止まります。ある行は実行されません。
<img width="912" alt="スクリーンショット 2020-08-07 22.07.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/2976f0d5-47af-2619-9e3c-71a1c4adb331.png">

　指定した行で処理が止まり、**「変数の状態を見る」**ことと**「1行ずつ実行する」**ことができます。

　下は、コードを足して21行目にブレークポイントを付けて実行した結果です。停止中にマウスのカーソルを変数```i```上に持っていくと、次のように中身を見ることができます（1から100まで足し合わせると5050らしい）。
<img width="624" alt="スクリーンショット 2020-08-08 12.08.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/39131701-65c0-9cb9-6864-865d3b51b46e.png">
　停止状態から1行ずつ実行することができます。図中の**黄色い線の上**に何やらボタンがありますね。
<img width="912" alt="スクリーンショット 2020-08-07 22.07.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/5c143d8d-2e60-3417-bcd2-55a6c3e1d76c.png">
<img width="161" alt="スクリーンショット 2020-08-07 22.24.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/ccfc1571-116c-7373-e182-fa309c51eeb5.png">

左から1~5とすると、その機能は次のようになります。
1. ブレークポイントの有効（色が濃い状態）・無効（色が薄い状態）を切り替える
2. 実行を再開する
3. 1行だけ実行する（ステップオーバーと言います）
4. 関数の中に入る（ステップインと言います）
5. 関数の外に出ます（ステップアウトと言います）
　ちなみに無効状態は削除されたわけではありません。ブレークポイントを削除したい場合は、行番号の外にドラッグ＆ドロップしましょう。


### ウォッチポイント
　指定した変数の値が変化したタイミングで処理を止めることができます。この変数がウォッチポイントです。設定するにはブレークポイントを使って一度停止させます。
　下図の**ここ！**部分でウォッチポイントの設定を行います。ちなみに**ここ！**部分は**Variables View**といい、停止位置以前で宣言されている変数の状態が確認できます。
<img width="720" alt="スクリーンショット 2020-08-07 22.31.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/07b54c47-431f-160e-1d80-1c2500895b80.png">
Variables View内の変数を右クリックすると、下図のように```Watch "○○"```があります。これでウォッチポイントが設定できます。その後実行を進めていて変数の値が変わった時、それを検知して実行が止まります（実行を停止するとウォッチポイントは消えます）。
<img width="338" alt="スクリーンショット 2020-08-07 22.42.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/40d6f209-2817-3152-d777-81d7aecd4fbf.png">


### LLDBを使う
　LLDBとはデバッガのことで、上記で行ってきた操作は全て裏側でLLDBが動いています。ここでは、コマンドを使ってLLDBを（GUIでなく）直接操作してみましょう。
　今回紹介するコマンドは1つ、```po```です。ぽ！
ブレークポイントで停止中のコンソール画面（下図**ここ！**部分。<font color="Green">**(lldb)**</font>とあるね。）に```po```コマンドを入力して行います。
<img width="678" alt="スクリーンショット 2020-08-08 11.14.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/0779f6de-c0f4-4f42-46fd-6c8348dbf656.png">
私、```po```は```Print Object```の略だよ、と聞きました。その通り、```po ○○```と入力することで、オブジェクトの内容を出力できます。
　例えば、```po i```とすると、```5050```と出力されます。次の画像をみてください↓。
また、```po```コマンドを使うと、値を見るだけでなく**値を書き換えることができる**んです。
<img width="715" alt="スクリーンショット 2020-08-08 11.25.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/a8bf472c-3b4f-507f-93ee-b9e1ffa9f530.png">
　```po i = 100```とすることで、iの値を5050から100に書き換えることができていますね。このまま実行・ステップ実行して進めることで、書き換わった値のまま処理を進めることができます。

＊~~値の書き換えは、ブレークポイントで停止中に書き換えたい変数をダブルクリックすることで行えます。~~のはずだったのですが、私の環境で試したところ、できなくなっていました。値を書き換えて処理を進めたい方は、上記の方法を使ってみてください。

### Viewの重なりを見る
　Xcodeでレイアウトを作成する場合、画面を階層構造で表現します。土台のViewがあって、その上に子Viewを重ねていく、挿入していくイメージです。Xcodeでは、画面の重なりをひとめで確認できます。

　上記の機能を確認するために、以下のような画面の構成を作りました。
<img width="912" alt="スクリーンショット 2020-08-08 11.34.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/f1f1ff45-24b0-c241-2866-89f990c4822e.png">
　画面の構成は、```View```という土台があって、その中に```Child View One```を重ね、その中に```Child View Two```、その中に```Child View Three```と```Child Three Label```を重ねてます。重なりがわかるように画面中央に階層構造が表示されていますが、右側に表示される画面のレイアウトは2Dなので、わかりにくいと感じる方もいるでしょう（複雑な画面の構成になってくるとわかりにくくなります）。

　この画面のViewの重なりを可視化しましょう。アプリを実行してください（今回はブレークポイントで止めなくて大丈夫です）。そしたら、```Debug View Hierarchy```ボタンを押下しましょう。これは下のようにステップアウトボタンの右にあります。
<img width="465" alt="スクリーンショット 2020-08-08 11.44.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/6baeaffb-1e22-102d-c637-c5b23642b772.png">
　アプリを実行した状態でこのボタンを押すと、Xcode上に下のようにアプリの画面が表示されます。この画面をマウスドラッグすることで、画面を見る視点の方向を変えることができます。これにより、階層構造が3Dに可視化できます。
<img width="920" alt="スクリーンショット 2020-08-08 11.48.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520690/54433df1-a87c-96c3-fd7c-e21c55052591.png">


### まとめ
　デバッグをするためのXcodeの便利機能を紹介しました。Xcodeに限った話ではなく、様々なエディタで同様のデバッガが実装されています。
　デバッガを使う理由は、間違いを見つけるだけでなく、コードのわからない部分を理解することだと思います。初めて参加するプロジェクトや、誰かが書いたコードを確認する際にも大いに活躍します。ぜひご活用ください！

　もし、間違っている部分や不適切な表現があれば、教えてください🙌