Xcode
iOS
アプリ
Swift
アプリ開発

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

More than 1 year has passed since last update.


はじめに

みなさんこんにちは。

12/13担当の新卒エンジニアです。

最近職場では、アプリチームに配属されAndroidアプリを開発しています。

また,遊びでiOSアプリ開発やってます。

昨晩、この記事を書きながら寝落ちしました。

遅くなってしまいましたが投稿いたしますmm


最近聞いた話

この間実施された社内勉強会でコンパイラのお話を聞きました。

それは「LLVM」。

LLVMとは、wikipediaでは以下のように説明されています。


コンパイル時、リンク時、実行時などあらゆる時点でプログラムを最適化するよう設計された、任意のプログラミング言語に対応可能なコンパイラ基盤である。


ほぉ。

自分はコンパイラに詳しくないので詳細にはわからなかった部分もありますが...

iOSアプリ開発でllvmを基盤としたlldbを使ったデバッグができるとのお話を聞き、やってみようと思ったので使い方をまとめてみます。

ちなみに、xcode4からデフォルトのコンパイラがLLVMに変更になっていたみたいです。


デバッグ方法

lldbのデバッグコマンドを実行することでデバッグすることができます。

デバッグするためにはブレイクポイントを設定しプログラムの実行が一時的に停止させなくてはいけません。

run時にクラッシュした場合に停止している状態も同じですね。

クラッシュした場合だと以下のようになります。

スクリーンショット 2016-12-13 10.53.31.png

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

(lldb) p tmp

(Int?) $R0 = nil

こんな感じです。


デバッグコマンド紹介

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


help

定番のヘルプコマンド

利用できるコマンド一覧を確認できます。

このコマンドだけで事足りる人はこの記事は不要ですね...

スクリーンショット 2016-12-13 12.09.00.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とすれば評価することが可能です。

ただし、元の変数の値は変化しませんので注意してください

スクリーンショット 2016-12-13 12.10.32.png


br list

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


br disable (ブレークポイント番号)

指定したブレイクポイントを無効化できます

スクリーンショット 2016-12-13 12.12.18.png


br enable (ブレークポイント番号)

指定したブレイクポイントを有効化できます

スクリーンショット 2016-12-13 12.12.54.png


expression 変数 = 値

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


frame variable

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


bt

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

よく使いそうなコマンドはこのくらいでしょうか。

ちなみに、C/C++/Objective-C/Swiftのコードも実行することができるそうです[3]。といってもメモリ領域の確保程度のようですが、使ってみたい方は試してみると良いと思います。

ちなみに、フローコントロール系のコマンドについてはxcodeのgui操作でも可能ですので試してみてください

スクリーンショット 2016-12-13 12.01.27.png


まとめ

簡単な紹介となってしまいましたがいかがだったでしょうか。

大規模なアプリ開発はしたことなかったのでlldbを使ったデバッグは行ったことありませんでしたが、これを機に使い始めています。デバッグは早くなると開発スピードも変わりますね。

llvmについては説明きれませんでしたが、コンパイラに興味のある方は調べてみてはいかがでしょうか。

LLDBについては、iOSアプリ開発をしている方はもう当たり前に使っていたでしょうか?

知らなかった人はこれから使ってみましょう!

読んでいただきありがとうございましたmm


参考文献

以下ページの情報を参考にさせていただきました。ありがとうございます!

こちらのページでより解説されておりますので、こちらも合わせてご覧下さい


  1. wikipedia

  2. Xcode 4 でデフォルトになった LLVM って何?

  3. 入門LLDB

  4. Xcode5でLLDBデバッガコマンドを使ってみる