幾種實用調試方法-C語言

程序調試,使用gdb的還是比較少,通常只是打印到終端來調試。調試方法有很多,然而使用統一的調試風格和方法,能有效的debug程序和管理debug信息,方便release版本和debug版本的發佈。以下是我經常使用的幾種調試方法,方法不用多,只需善於使用一種即可。

使用inline函數:

(編譯階段)能避免使用宏可能帶來的副作用,而且方便日後定製debug信息的輸出,特別方便維護和修改。我可以隨時修改它,比如打印到網絡服務器,本地文件,其他終端等,很方便的重定向。這是我最喜歡使用的方法。

#ifdef DEBUG
static void dprint(const char *s, ...)
{
	va_list p;

	va_start(p, s);
	fflush(stdout);
	vfprintf(stderr, s, p);
	va_end(p);
}
#else
static inline void dprint(const char *s, ...)
{

}
#endif



使用宏定義:

(編譯階段)使用宏雖然會帶來一些副作用,但在使用過程中注意點,也沒什麼大礙,靈活定製debug宏,可以大大方便程序的調試,比較直觀簡介。

#define dev_printk(level, dev, format, arg...)    \
    printk(level "%s %s: " format , (dev)->driver ? (dev)->driver->name : "" , (dev)->bus_id , ## arg)

#ifdef DEBUG
#define dev_dbg(dev, format, arg...)        \
    dev_printk(KERN_DEBUG , dev , format , ## arg)
#else
#define dev_dbg(dev, format, arg...) do { (void)(dev); } while (0)
#endif
#define TRACE(var,fmt) do { printf("%s:%u: ", __FILE__, __LINE__); printf("[%s] ", __FUNCTION__); printf("TRACE: " #var " = " #fmt "\n", var);} while (0);

使用宏定義+全局變量:

(運行時)可以簡單的控制debug信息的輸出與否,運行過程中也可以隨時控制debug信息是否輸出。在代碼量比較少的情況下還可以接受。程序龐大則不宜使用。

static int usbfs_snoop = 0;

#define snoop(dev, format, arg...)                \
    do {                            \
        if (usbfs_snoop)                \
            dev_info( dev , format , ## arg);    \
    } while (0)


使用全局變量+函數:

(運行時)實現分消息等級的信息輸出,運行時可隨時決定是否輸出debug信息。

int xxx_debug = 100;

void xxx_set_debug(int level)
{
  if (xxx_debug || level)
    fprintf(stderr, "xxx_set_debug: Setting debugging level to %d (%s)\n",
    level, level ? "on" : "off");

  xxx_debug = level;
}

/* 用全局變量xxx_debug決定是否輸出調試信息 */
  if (xxx_debug) {
    if (xxx_path[0])
      fprintf(stderr, "xxx_func: Found xxx  at %s\n", xxx_path);
    else
      fprintf(stderr, "xxx_func: No xxx  found, is it mounted?\n");
  }

/* 結合宏使用 */
#define XXX_ERROR_STR(x, format, args...) \
    do { \
      usb_error_type = XXX_ERROR_TYPE_STRING; \
      snprintf(xxx_error_str, sizeof(xxx_error_str) - 1, format, ## args); \
          if (xxx_debug >= 2) \
            fprintf(stderr, "XXX error: %s\n", xxx_error_str); \
      return x; \
    } while (0)







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章