デバッグとは、ソフトウェアのバグを見つけて修正する作業のことです。そのため、デバッグはソフトウェアの品質向上に欠かせません。
本記事では、デバッグの目的やソフトウェアテストとの違い、バグを検出する際の4つの観点について初心者向けに解説します。
また記事の後半では、デバッグで用いられる手法や、大まかなやり方も紹介するので、ぜひ最後までご覧ください。
- もくじ
1.デバッグとは
デバッグとは、ソフトウェアのバグ(問題)を特定し、取り除く作業のことです。実際にソフトウェアを実行しながら、正しく動作するかチェックします。バグが見つかった場合の原因調査や修正、再チェックもデバッグに含まれる重要なプロセスです。
ここではデバッグの基本事項として、意味や目的、混同されやすいテストとの違いを解説します。
1-1 デバッグの意味・目的
デバッグは英語で「debug」と表記します。この英語は、虫を意味する「bug」に、「除去」を意味する「de」を付けたものです。つまり、デバッグは「ソフトウェアの虫(バグ)を除去する」といった意味合いになります。
以前は、虫の侵入によりコンピューターが故障することは珍しくありませんでした。コンピューターが故障すれば、業務に大きな影響が生じてしまいます。同じように、ソフトウェアに虫(バグ)が混入すれば、後々の開発工程でのトラブルは避けられません。
そこでソフトウェアのバグを除去し、品質を向上させる目的で行う作業がデバッグです。また、バグを実装段階で除去することで、以降の開発工程に費やす工数増大を防ぐこともデバッグの目的といえます。
1-2 デバッグとテストの違い
デバッグと混同されやすい言葉として「テスト」が挙げられます。テストとは、ソフトウェアの機能や性能に問題がないか確認する作業のことです。実際にソフトウェアを動作させる点はデバッグと同様ですが、テストは「ソフトウェアに問題がないと保証すること」に焦点を当てます。
一方のデバッグは、「ソフトウェアのバグを除去すること」に焦点を当てた作業です。作成したプログラムにバグがある前提で行うため、実装の延長線上にある作業といえます。
テストで見つかったバグを除去するのもデバッグです。テストでは問題を見つける段階まで行いますが、修正作業は含まれません。
2.デバッグにおける主な4つの観点
デバッグにより確実にバグを検出するためには、どのような観点でソフトウェアを確認するのかが重要です。デバッグにおける主な観点として、次の4つを押さえておきましょう。
2-1 想定した経路を通るか
デバッグでは、想定した経路を通るかをソースコードレベルで確認します。
条件分岐では変数の値を変えて、仕様や設計に合致した処理が選ばれるか確認しましょう。全経路の通過確認だけでなく、分岐のバリエーションも含めて網羅的に確認することで、バグを見逃しにくくなるでしょう。
2-2 変数のデータ内容が適切か
デバッグでは、プログラムに欠かせない変数のデータ内容が適切かの確認も必要です。
変数に代入するデータや、更新タイミングを誤ることは想定されます。各処理において変数に格納されたデータの内容を確認することで、こうしたミスの検出が可能です。
後述するIDE(統合開発環境)を用いたデバッグでは、一般的に「ウォッチ機能」によって変数のデータ内容を確認できます。
2-3 関数・モジュールの呼び出しが適切か
関数・モジュールの呼び出しが適切に行われているのかも、デバッグにおいて確認すべきポイントです。
呼び出すモジュール名を取り違えたり、1度の呼び出しでよい関数が重複して呼び出されたりするケースも考えられます。関数やモジュールの呼び出しを階層的に確認することで、バグはもちろん無駄な処理の繰り返しといった問題の検出も可能です。
後述するIDEを用いたデバッグでは、一般的に「スタックトレース機能」によって関数やモジュールの呼び出し階層を可視化できます。
2-4 クラッシュやメモリリークが発生しないか
ソフトウェアにおいて重大な問題が発生しないかの確認も欠かせません。
たとえば変数の参照方法を誤り、想定外のメモリ領域にアクセスを試みてクラッシュするケースが散見されます。
また、確保したメモリの解放を忘れてしまう「メモリリーク」が発生すると、ソフトウェアのパフォーマンス低下につながる恐れがあります。クラッシュやメモリリークといった問題は、デバッグで確実に検出すべきです。
3.デバッグに使われる主なツール
デバッグには専用のツールを用いることが一般的です。デバッグに使われる主な2種類のツールを把握しておきましょう。
3-1 IDE(統合開発環境)
IDE(統合開発環境)は、ソフトウェア開発におけるプログラミングに欠かせない機能を集約したツールです。
ソースコードの記述やプログラムファイルの管理、プログラムのビルド・実行などが1つのツールで行えます。
大半のIDEにはデバッグに役立つ機能が搭載されており、最もポピュラーなデバッグ手段です。IDEが持つ代表的なデバッグ機能は下表のとおりです。
機能 | 概要 |
---|---|
ブレークポイント | 実行中に特定のステップ(行)で処理を停止できる |
ウォッチ | 変数のデータ内容を可視化できる |
スタックトレース | 関数やモジュールの呼び出し階層を可視化できる |
3-2 シミュレータ
IDEだけではデバッグが難しい場合、さまざまなシミュレータが用いられます。
たとえば車載システムをデバッグする場合、実機で想定されるシチュエーションをIDEで正確に再現することは困難です。
そのため、「CANoe」のようなツールにより外部との通信をシミュレートし、細かいデータの変化や外部モジュールとの兼ね合いを再現します。
4.デバッグで用いられる代表的な手法
デバッグには、さまざまな手法が用いられます。デバッグで用いられる代表的な手法として、次の3つを把握しておきましょう。
4-1 スタブ
「スタブ」とは、関連する関数やモジュールの機能を模擬するプログラムのことです。
デバッグ対象の関数が外部モジュールを呼び出すものの、呼び出し先の処理がまだ完成していないケースもあります。こうしたケースでは、スタブにより外部モジュールの処理や応答を疑似的に再現することで、デバッグしたい機能の確認が可能となります。
4-2 デバッグログ
「デバッグログ」とは、デバッグ目的でソフトウェアの動作状況を記録する仕組みのことです。
データをログファイルに出力するための仕組みを作り、それをプログラムの必要な箇所に追加します。変数値や通過した経路などの情報を記録することで、ソフトウェアの実行後に動作が想定どおりかの確認が可能です。IDEだけではデバッグが難しい場合、デバッグログを仕込んだソフトウェアを実機で動かしてデバッグすることがあります。
4-3 デバッグモード
ゲーム開発のような分野では、「デバッグモード」を採用することも珍しくありません。デバッグモードとは、デバッグのために用意された専用の画面や機能のことです。
ソフトウェア動作をデバッグモードへ切り替えることで、内部データの確認や変更が行えます。
デバッグモードは、プログラムの開発者とデバッグ者が異なる場合に有効です。プログラムに関する知識が少ないデバッグ者でも、専用の画面で迷わずにデバッグが行えます。
5.デバッグの大まかなやり方
デバッグの手順や流れは、手法によっても変わってきます。ここでは、特にポピュラーなIDEを用いたデバッグを例に、大まかなやり方を紹介します。
5-1 プログラムの変更
まずは必要なプログラムの変更を行い、デバッグが可能な状態にします。
デバッグ対象の機能・モジュールを完成させるだけでなく、必要なスタブやデバッグログもこの段階で準備しましょう。
5-2 デバッグに必要な設定を行う
プログラムを動かす前に、デバッグに必要な設定を行いましょう。
たとえば、動作を止めたい行へのブレークポイント設定や、確認したい変数のウォッチ登録などを行います。ただしローカル変数の場合、実行時でないとウォッチに登録できない場合もあります。
5-3 プログラムをビルド・デバッグ実行する
必要な設定を行ったうえで、プログラムをビルド・実行します。
一般的なIDEにはデバッグ・リリースといった実行モードがありますが、デバッグ実行を選択しましょう。
5-4 ステップ単位でプログラムの挙動を確認する
デバッグ実行を開始した後は、経路や変数などを含めたプログラムの挙動を確認していきます。
厳密な確認が必要な箇所は、ステップ単位で丁寧に実行を進めていきましょう。
5-5 問題箇所を調査・修正する
プログラムの挙動に問題が見つかった場合は、問題箇所の調査・修正が必要です。
修正後には同じシチュエーションを再現し、問題が解消されたか再チェックしましょう。バグがひと通り解消されるまで、動作確認と調査・修正を繰り返します。
まとめ:適切なデバッグによりソフトウェアの品質向上を
デバッグとは、ソフトウェアのバグ(問題)を検出し、取り除く作業のことです。
IDEやシミュレータといったツール、スタブやデバッグログ、デバッグモードといった手法が一般的に用いられます。
デバッグで検出できないバグが後の工程で判明すると大きな手戻りは避けられません。
それどころか、ソフトウェアのリリース後に市場不具合として明るみに出るケースもあります。ソフトウェアの品質を向上させるうえでは、デバッグに対する正しい理解が不可欠といえるでしょう。