効率的なデバッグに関するあれこれ。
まとまり悪いですが。
おしながき
見たい値を変数に.
保守性 | 処理速度 | メモリ効率 | 難易度 |
C++Builderなどは実行中のソースコードに記述されている変数をポイントすると変数の値が表示されて便利なのです。しかし複雑な演算を行っていてその記述が期待どおりか調べたい場合、演算式の途中結果までは表示できません。
このようなとき、値を見たい部分を適当な変数に代入すれば、値を見れるようになります。
デバッグライト.
保守性 | 処理速度 | メモリ効率 | 難易度 |
概要.
動作確認のために値を監視したい変数が多数ある場合、前節のようにデバッガで1つ1つ値を見ていたのでは、なかなか進むことが出来ません。そこで値を監視したい変数などを、実行中に特定の場所に表示するようにソースコードを記述し、監視を楽にする手法がデバッグライトです。
この方法にはいろいろ利点があります。
- 一度に複数の変数の値を監視することもできる。
- 動作箇所を識別できる表示にすることにより、動作フローの確認にも使える。
- 表示先を選択できる。主なものは、標準出力/ダイアログ/特定のウィンドウ/画面の隅の方など。
- デバッガでステップ/トレースするのと違い、ほぼ実時間で実行できるので、タイミングが問題になるバグにも使える。(タイミングがあまりシビアな場合は別)
- デバッガが使えない/用意されていない環境でも有効。
ソースコードに手を加えるのでそれなりに工数が発生しますし、デバッグライトとして出力する内容も検討も必要です。ある程度規模の大きなソフトウェアを作成する場合によく用いられます。
実装方法.
デバッグライト自身はリリース版ソフトウェアには必要ないものなので、リリース版のみ表示を無くすことが出来るように工夫する必要があります。
その実装方法はいろいろあると思いますが、代表的なものを説明します。
-
#ifdefを利用
#ifdef〜#endif間にデバッグライトのソースコードを記述し、特定のマクロ定義の有無でデバッグ時のみデバッグライトを有効にします。最も簡単です。
#ifdef DEBUG printf( (中略) ); #endif
-
専用の関数を定義
デバッグライトの出力専用の関数を定義し、デバッグライトの出力を行いたい箇所でこの関数を呼び出します。関数の作り次第でより高機能にも出来ますし、デバッグライトの仕様を変えたい場合も出力関数の定義を変更するだけである程度対応できます。
void debugwrite(int info) { printf( (中略) ); }
Copyright 2005-2016, yosshie.