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)。如果仍然存在错误条件,则会一次又一次地调用错误处理程序,直到堆栈溢出。在最坏的情况下,开发人员甚至不会看到任何消息(例如,如果 bug 在 printf 的开头)。

问题是:在错误处理程序中避免递归调用,同时仍然获得一些调试信息的好技术是什么?

4

1 回答 1

1

将全局变量初始化为最大深度以避免递归调用。

调试.c

unsigned Debug_MaxDepth = 5;

调试.h

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