Aritalab:Lecture/Programming/Debug
From Metabolomics.JP
< Aritalab:Lecture | Programming(Difference between revisions)
(New page: ==Debugの仕方== ==Print Debug== いわずと知れた、print文をプログラムの随所に挟むデバッグ法です。 <pre> #ifndef NDEBUG </pre> ==Assert Debug== assertと...) |
(→Print Debug) |
||
Line 5: | Line 5: | ||
いわずと知れた、print文をプログラムの随所に挟むデバッグ法です。 | いわずと知れた、print文をプログラムの随所に挟むデバッグ法です。 | ||
<pre> | <pre> | ||
− | + | const bool PDEBUG = true; | |
− | + | : | |
+ | : | ||
+ | if (PDEBUG) { ... printf(変数); ...} | ||
</pre> | </pre> | ||
+ | デバッグに使う文を全てPDEBUGというブール定数の下に置いておけば、デバッグ終了後に<tt>PDEBUG = false;</tt>と置くだけでデバッグ用のコードは全てコンパイル時に無視されます。(if文の条件部が定数のfalseであるため。) | ||
+ | |||
+ | この仕組みで効率的なデバッグは十分可能です。 | ||
==Assert Debug== | ==Assert Debug== |
Revision as of 16:04, 12 October 2010
Contents |
Debugの仕方
Print Debug
いわずと知れた、print文をプログラムの随所に挟むデバッグ法です。
const bool PDEBUG = true; : : if (PDEBUG) { ... printf(変数); ...}
デバッグに使う文を全てPDEBUGというブール定数の下に置いておけば、デバッグ終了後にPDEBUG = false;と置くだけでデバッグ用のコードは全てコンパイル時に無視されます。(if文の条件部が定数のfalseであるため。)
この仕組みで効率的なデバッグは十分可能です。
Assert Debug
assertとは「主張」の意味で、プログラム実行中にtrue/falseを検証するために使います。 assert文で検証するのは「真とみなされる論理式」である点に注意してください。
Javaの場合
Javaの場合は、エラーメッセージを出力することができます。
assert denominator != 0 : "Division by zero!";
C++の場合
C++のassert文は以下のようにして使えます。
/* #define NDEBUG */ #include <assert.h> : : assert( ...);
直前のNDEBUGをコメントアウトすると、No Debugの意味でプログラム中の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); }