有多种方法可以在复杂的软件中进行动态检查:
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)。如果仍然存在错误情况,将一次又一次地调用错误处理程序,直到堆栈溢出。在最坏的情况下,开发人员甚至不会看到任何消息(例如,如果bug在printf的开头)。
问题是:什么是在bug处理程序中避免递归调用的好方法,同时仍然获得一些调试信息?
答案 0 :(得分:1)
将全局变量初始化为最大深度以避免递归调用。
debug.c
unsigned Debug_MaxDepth = 5;
debug.h
#define BUG( ) \
{ \
if (Debug_MaxDepth > 0) { \
Debug_MaxDepth--;
printf("BUG found ...\n"); \
} \
exit(1); \
}