2

複雑なソフトウェアで動的チェックを行うには、いくつかの方法があります。

  1. assert.h の実装assert( expression_that_must_be_true );
  2. Linux カーネル スタイル:

    if (in_interrupt())
            BUG();
    

チェックされた条件の値が期待どおりでない場合、何らかのバグ ハンドラが呼び出されます。

例えば:

#define BUG( ) \
{ \
 printf("BUG found (function %s file %s line %d)\n", __FUNCTION__, \
                    __FILE__, __LINE__); \
 exit(1); \
}

バグ処理のこの最も単純な実装でさえ、いくつかのバグが隠されている可能性があります (「バグのないプログラムは存在しない」ため)。このバグは、このバグ ハンドラの再帰呼び出しにつながる可能性があります (たとえば、printf から)。バグの状態が続く場合は、スタックがオーバーフローするまでバグ ハンドラが何度も呼び出されます。最悪の場合、開発者は何のメッセージも見ることができません (たとえば、バグが printf の先頭にある場合)。

質問: デバッグ情報を取得しながら、バグ ハンドラで再帰呼び出しを回避するための優れた手法は何ですか?

4

1 に答える 1

1

再帰呼び出しを避けるために、グローバル変数を最大深度に初期化します。

debug.c

unsigned Debug_MaxDepth = 5;

debug.h

#define BUG( ) \
{ \
  if (Debug_MaxDepth > 0) { \
    Debug_MaxDepth--; 
    printf("BUG found ...\n"); \
  } \
exit(1); \
}
于 2013-05-24T03:51:36.217 に答える