複雑なソフトウェアで動的チェックを行うには、いくつかの方法があります。
- assert.h の実装
assert( expression_that_must_be_true );
Linux カーネル スタイル:
if (in_interrupt()) BUG();
チェックされた条件の値が期待どおりでない場合、何らかのバグ ハンドラが呼び出されます。
例えば:
#define BUG( ) \
{ \
printf("BUG found (function %s file %s line %d)\n", __FUNCTION__, \
__FILE__, __LINE__); \
exit(1); \
}
バグ処理のこの最も単純な実装でさえ、いくつかのバグが隠されている可能性があります (「バグのないプログラムは存在しない」ため)。このバグは、このバグ ハンドラの再帰呼び出しにつながる可能性があります (たとえば、printf から)。バグの状態が続く場合は、スタックがオーバーフローするまでバグ ハンドラが何度も呼び出されます。最悪の場合、開発者は何のメッセージも見ることができません (たとえば、バグが printf の先頭にある場合)。
質問: デバッグ情報を取得しながら、バグ ハンドラで再帰呼び出しを回避するための優れた手法は何ですか?