几种实用调试方法-C语言
来源:互联网 发布:2017重庆消防网络晚会 编辑:程序博客网 时间:2024/06/05 03:58
程序调试,使用gdb的还是比较少,通常只是打印到终端来调试。调试方法有很多,然而使用统一的调试风格和方法,能有效的debug程序和管理debug信息,方便release版本和debug版本的发布。以下是我经常使用的几种调试方法,方法不用多,只需善于使用一种即可。
使用inline函数:
(编译阶段)能避免使用宏可能带来的副作用,而且方便日后定制debug信息的输出,特别方便维护和修改。我可以随时修改它,比如打印到网络服务器,本地文件,其他终端等,很方便的重定向。这是我最喜欢使用的方法。
#ifdef DEBUGstatic void dprint(const char *s, ...){va_list p;va_start(p, s);fflush(stdout);vfprintf(stderr, s, p);va_end(p);}#elsestatic 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)
- 几种实用调试方法-C语言
- C语言中的几种排序方法
- css几种实用方法
- 几种实用的推广方法 转载
- 几种排序方法的实现 (C语言)
- 几种排序方法的C语言实现
- C语言数组清空的几种方法比较
- c语言数据交换的几种方法
- 数据排序的几种方法(c语言实现)
- C语言中定义结构体的几种方法
- C语言实现strlen函数的几种方法
- c语言数据交换的几种方法
- 数据排序的几种方法(c语言实现)
- 【C语言】逆转二进制数的几种方法
- C 语言取整的几种方法
- 二级c语言之常用的几种排序方法
- 几种常见的排序方法(C语言实现)
- C语言交换两个变量数值的几种方法
- Writing a Critical Essay
- SQL语句
- Writing a Narrative Essay
- Writing a Descriptive Essay
- vim配置文件(持续更新)
- 几种实用调试方法-C语言
- ASP.NET 文字编辑控件 KindEditor使用方法
- Writing a Reflective Essay
- Writing an Argumentative Essay
- Writing a Compare and Contrast Essay
- 买股票的步骤及基础常识
- Writing a Cause and Effect Essay
- Google Protocol Buffers浅析(一)
- Writing a Research Essay