iOS(iPhone)アプリを作り始めるといろんな不具合やエラーに悩まされることは多いですよね。アプリ開発を始めたばかりでエラーの内容もよくわからいし、原因の特定の仕方もわからなくて進まなくなったということもあると思います。実際、エンジニアはどうやって不具合やエラーを解決しているのか気になるところですよね。
今回は、エンジニアが使っているデバッグ手法を紹介していきたいと思います。
デバッグとは?
不具合やバグなどを見つけて直していく作業のことで、プログラミングをやっていく上で必ず必要になってきます。
デバッグは、不具合やエラーの原因を見つけてプログラムを修正するためにデバッガーと呼ばれるツールを使います。
iOSアプリ開発では、標準でついているXcodeのデバッガーを利用してデバッグしていきます。
Xcodeのデバッグエリア
Xcodeにはデバッグするため機能がついており、この機能を使って処理を1度止めたり、ログを出力しておかしな値が入っていないか調べたりすることができます。まずは、これらの機能を使いこなせるようになることがiOSアプリをデバッグする第一段階と言えます。
大前提としてエラーはしっかり読もう
1番最初に身につけて欲しいのは、エラーメッセージを「わからない」で終わらせるのではなくしっかり読むことです。エラーメッセージには、問題点の内容・発生場所・発生の時間など様々な情報が含まれています。
ネットで調べなくてもエラーの原因を考えたり、人に聞く時の参考情報として伝えることができるため聞かれた方も答えやすくなります。クラッシュやエラーなどがある時は、ほぼ必ずエラーログが上がってくるので必ず読みましょう。わからないキーワードがあったときは、1度調べてどんな内容なのか理解しようとすることも大切です。
デバッグ手法5選
ここからは、具体的なデバッグの手法を紹介していきます。どれも比較的簡単に試すことができるので、デバッグの手法を学んで見たい人は是非試してみてください。
ビューのレイアウトが見れるView Hierarchy
UIのレイアウトを立体的に確認することができる機能です。UIが正しく表示されない時に、どこがおかしいのかを視覚的に確認するために使っています。例えば、ボタンを設置しているけどビューの裏に隠れてしまっている時などにView Hierarchyを使うことで気づくことがあります。
アプリ実行中にデバッグエリアの階層ボタンを押すことで、現在表示しているビューの階層構造を表示することができます。
処理の結果をログ出力して見る
コード中に以下のメソッドを使用すると処理中の値をコンソールにログとして出力することができます。print -> debugPrint -> dumpとなっていくごとに、以下のように出力内容が詳しくなっていきます。
let numbers = 1...5
print(numbers)
/*
Output:
1...5
*/
debugPrint(numbers)
/*
Output:
ClosedRange(1...5)
*/
dump(numbers)
/*
Output:
▿ ClosedRange(1...5)
- lowerBound: 1
- upperBound: 5
*/
ログに色を付けて分ける
標準出力に対してemojiを設定してエラーの時、クラッシュの時、例外のときなどで分けることができます。下記のようにログの先頭に絵文字を表示することでログを見分けやすくなります。
enum LogType: String {
case info
case warning
case error
case verbose
case debug
}
class Logger {
static func log(_ logType: LogType, _ items: Any) {
switch logType {
case LogType.info:
print("📗 Info: ", items)
case LogType.warning:
print("📙 Warning: ", items)
case LogType.error:
print("📕 Error: ", items)
case LogType.verbose:
print("📘 Verbose: ", items)
case LogType.debug:
print("📓 Debug: ", items)
}
}
}
ブレークポイント(breakpoint)で処理を止める
ブレークポイントという機能を使うと実行中の処理を一時的に停止することができます。この機能の良いところは、ログなどを仕込まなくても止めた時点の変数の値を確認することができることです。ブレークポイントで止めたときの変数の値をデバッグエリアできます。
lldbコマンドで実行中の値をみる
Xcodeではlldbコマンドを利用することができます。このlldbコマンドを使うことでも変数の値を確認することができます。lldbで代表的なコマンドは、poコマンドとexpressionコマンドです。ブレークポイントで止まっているときに、デバッグエリアのコンソールで実行することができます。
Step機能を利用する
ブレークポイントには、Step実行というものが提供されています。ステップ実行には、以下のボタンから実行することができます。引き続き処理を止めて実行結果を追跡したいときに利用します。
左から順に以下の働きをします。
コマンド | 解説 |
---|---|
Continue/Pause | 一時停止した処理を解除して、処理を再開する |
Step over | 一時停止しているメソッドを実行した後に、引き続き処理を停止する |
Step into | 一時停止しているメソッドの内部に入り込んで、引き続き処理を停止する |
Step out | 一時停止しているメソッドの外に出て、引き続き処理を停止する |
スレッドでエラーの場所を特定する
ブレークポイントを使用したときやクラッシュしたときに、ナビゲーションエリアからスレッドをチェックすることができます。エラー時などにどこから実行されているのか特定するときに活用します。例えば、以下の場合だとLogger.logメソッドで処理が止まっていることが確認できます。
デバッグ機能を上手く使おう
様々なデバッグ手法を使うことで、エラーや不具合の原因を特定したり動作を確認するのが非常にやりやすくなります。開発ではデバッグ作業は必ず発生するので、デバッグツールの使い方を覚えて開発にかける時間を増やせるようにしていきましょう。