Aritalab:Lecture/Programming/Debug
From Metabolomics.JP
Contents |
Debugの仕方
Print Debug
いわずと知れた、print文をプログラムの随所に挟むデバッグ法です。
const bool PDEBUG = true; : : if (PDEBUG) { ... printf(変数); ...}
デバッグに使う文を全てPDEBUGというブール定数の下に置いておけば、デバッグ終了後にPDEBUG = false;と置くだけでデバッグ用のコードは全てコンパイル時に無視されます。(if文の条件部が定数のfalseであるため。)
この仕組みで効率的なデバッグが十分可能です。
Assert Debug
最近のプログラミング本で紹介されるのが、assert文です。 assertとは「主張」の意味で、プログラム実行中にtrue/falseを検証するために使います。 assert文で検証するのは「真とみなされる論理式」である点に注意してください。
Javaの場合
Java言語はassertを言語仕様としてサポートしています。 Javaの場合は、エラーメッセージを出力することができます。
assert denominator != 0 : "Division by zero!";
エラーメッセージは無くても大丈夫です。
assert denominator != 0;
C++の場合
C++におけるassert文は単なるマクロです。 以下のようにして使えます。
/* #define NDEBUG */ #include <assert.h> : : assert( ...);
直前のNDEBUGをコメントアウトすると、No Debugの意味でプログラム中のassert文を全てコンパイル時に無視します。 つまり、ソースプログラムを変更しなくても実行速度が落ちないデバッグを実現できます。C++にこだわる人は#include <cassert>と書いても良いです。
しかし、このassert文はエラーメッセージを出さないので問題部分の特定がしづらく、使いづらいです。そこで以下のマクロを自分で定義しても良いでしょう。
#define ASSERT( condition, message ){\ if ( !(condition) ) { \ Error( "Assertion: ",(message),\ (__FILE__),(__LINE__) ); \ exit( -1 ); } } static void Error (const char* label, const char* msg, const char* fname, const int line) { //最低限の処理 printf("%s %s %s %d", label, msg, fname, line); }