几种实用调试方法-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)







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值