C风格的断言处理程序

时间:2012-05-26 14:53:30

标签: c assert assertions

有多种方法可以在复杂的软件中进行动态检查:

  1. assert.h implementation assert( expression_that_must_be_true );
  2. Linux内核风格:

    if (in_interrupt())
            BUG();
    
  3. 如果检查条件的值不符合预期,则会调用一些错误处理程序。

    例如:

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

    即使在这个最简单的错误处理实现中,也可以隐藏一些错误(因为“没有没有错误的程序”)。此错误可能导致此错误处理程序的递归调用(例如,来自printf)。如果仍然存在错误情况,将一次又一次地调用错误处理程序,直到堆栈溢出。在最坏的情况下,开发人员甚至不会看到任何消息(例如,如果bug在printf的开头)。

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

1 个答案:

答案 0 :(得分:1)

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

debug.c

unsigned Debug_MaxDepth = 5;

debug.h

#define BUG( ) \
{ \
  if (Debug_MaxDepth > 0) { \
    Debug_MaxDepth--; 
    printf("BUG found ...\n"); \
  } \
exit(1); \
}