簡體   English   中英

C風格的斷言處理程序

[英]C-style assertion handlers

有幾種方法可以在復雜的軟件中進行動態檢查:

  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的開頭)。

問題是:有什么好的方法可以避免在錯誤處理程序中進行遞歸調用,同時還能獲取一些調試信息?

將全局變量初始化為最大深度,以避免遞歸調用。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM