[英]C-style assertion handlers
有幾種方法可以在復雜的軟件中進行動態檢查:
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的開頭)。
問題是:有什么好的方法可以避免在錯誤處理程序中進行遞歸調用,同時還能獲取一些調試信息?
將全局變量初始化為最大深度,以避免遞歸調用。
debug.c
unsigned Debug_MaxDepth = 5;
debug.h
#define BUG( ) \
{ \
if (Debug_MaxDepth > 0) { \
Debug_MaxDepth--;
printf("BUG found ...\n"); \
} \
exit(1); \
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.