iOSアプリ開発でlldbデバッグやってみる

# はじめに
みなさんこんにちは。
12/13担当の新卒エンジニアです。
最近職場では、アプリチームに配属されAndroidアプリを開発しています。
また,遊びでiOSアプリ開発やってます。

昨晩、この記事を書きながら寝落ちしました。
遅くなってしまいましたが投稿いたしますmm

# 最近聞いた話
この間実施された社内勉強会でコンパイラのお話を聞きました。
それは「**LLVM**」。

`LLVM`とは、wikipediaでは以下のように説明されています。
> コンパイル時、リンク時、実行時などあらゆる時点でプログラムを最適化するよう設計された、任意のプログラミング言語に対応可能なコンパイラ基盤である。

ほぉ。

自分はコンパイラに詳しくないので詳細にはわからなかった部分もありますが...
iOSアプリ開発でllvmを基盤としたlldbを使ったデバッグができるとのお話を聞き、やってみようと思ったので使い方をまとめてみます。
ちなみに、xcode4からデフォルトのコンパイラがLLVMに変更になっていたみたいです。

# デバッグ方法
lldbのデバッグコマンドを実行することでデバッグすることができます。
デバッグするためにはブレイクポイントを設定しプログラムの実行が一時的に停止させなくてはいけません。
run時にクラッシュした場合に停止している状態も同じですね。
クラッシュした場合だと以下のようになります。

<img width="705" alt="スクリーンショット 2016-12-13 10.53.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/30890/e2602e8c-ddbe-f635-bf22-45ccb7411820.png">

画像の下の方表示されている`(lldb)`と表示されるプロンプトにコマンドを入力するとデバッグできます

```llvm
(lldb) p tmp
(Int?) $R0 = nil
```

こんな感じです。

# デバッグコマンド紹介
では使えそうなデバッグコマンドを紹介します。

## help
定番のヘルプコマンド
利用できるコマンド一覧を確認できます。
このコマンドだけで事足りる人はこの記事は不要ですね...
<img width="546" alt="スクリーンショット 2016-12-13 12.09.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/30890/8f417eb1-c598-da09-09c9-e440cac51f9f.png">

## run
アプリケーションを実行します。
※xcodeでrunすることと同じです。

## c または continue
停止地点から再開して実行を続けます。
※これはxcode上でgui操作もできます

## n または next
関数に入らず実行を続けます。
※これはxcode上でgui操作もできます

## s または step
関数に入って実行を続けます
※これはxcode上でgui操作もできます

## finish
関数から出ます
※これはxcode上でgui操作もできます

## quit
デバッグを終了します。

## p または print
変数の値を出力できます。
ちなみに、式も評価できます。
出力ないように`$0`という変数のようなものが表示されますが、これはlldbの名前空間に自動的に紐付けられる変数のことらしいです[3]。
ですので、例えば`$0 + 1`とすれば評価することが可能です。
ただし、元の変数の値は変化しませんので注意してください
<img width="106" alt="スクリーンショット 2016-12-13 12.10.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/30890/5b6c1494-9997-12d8-68f5-f6e2f7bef429.png">

## br list
ブレイクポイントの一覧を確認できます。

## br disable　（ブレークポイント番号）
指定したブレイクポイントを無効化できます
<img width="157" alt="スクリーンショット 2016-12-13 12.12.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/30890/ce790770-0f51-30b3-f829-6ed13d65ac50.png">

## br enable　（ブレークポイント番号）
指定したブレイクポイントを有効化できます
<img width="156" alt="スクリーンショット 2016-12-13 12.12.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/30890/8e3b3243-72b2-b780-4d76-603155414efd.png">


## expression 変数 = 値
変数が保持する値を変更することができます。

## frame variable
定義されている変数の一覧を確認することができます。

## bt
バックトレース情報を表示できます


よく使いそうなコマンドはこのくらいでしょうか。
ちなみに、C/C++/Objective-C/Swiftのコードも実行することができるそうです[3]。といってもメモリ領域の確保程度のようですが、使ってみたい方は試してみると良いと思います。
ちなみに、フローコントロール系のコマンドについてはxcodeのgui操作でも可能ですので試してみてください
<img width="196" alt="スクリーンショット 2016-12-13 12.01.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/30890/58c0864a-44cf-9351-9a21-8bd570f378c6.png">

# まとめ
簡単な紹介となってしまいましたがいかがだったでしょうか。
大規模なアプリ開発はしたことなかったのでlldbを使ったデバッグは行ったことありませんでしたが、これを機に使い始めています。デバッグは早くなると開発スピードも変わりますね。
llvmについては説明きれませんでしたが、コンパイラに興味のある方は調べてみてはいかがでしょうか。
LLDBについては、iOSアプリ開発をしている方はもう当たり前に使っていたでしょうか？
知らなかった人はこれから使ってみましょう！
読んでいただきありがとうございましたmm

# 参考文献
以下ページの情報を参考にさせていただきました。ありがとうございます！
こちらのページでより解説されておりますので、こちらも合わせてご覧下さい

1. [wikipedia](https://ja.wikipedia.org/wiki/LLVM)
1. [Xcode 4 でデフォルトになった LLVM って何?](http://blog.fenrir-inc.com/jp/2011/07/llvm.html)
1. [入門LLDB](http://sleepingcatsyndrome.com/post/107692770850)
2. [Xcode5でLLDBデバッガコマンドを使ってみる](http://d.hatena.ne.jp/tanaponchikidun/20120923/1348388081)