有几种方法可以在复杂软件中进行动态检查:
- 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)。如果仍然存在错误条件,则会一次又一次地调用错误处理程序,直到堆栈溢出。在最坏的情况下,开发人员甚至不会看到任何消息(例如,如果 bug 在 printf 的开头)。
问题是:在错误处理程序中避免递归调用,同时仍然获得一些调试信息的好技术是什么?