慣C除錯

本篇介紹在 C/C++ 下使用 printf 來 debug 的一些技巧,

Gist

https://stackoverflow.com/questions/1941307/c-debug-print-macros

最簡單的

1
#define DEBUG_PRINT(fmt, ...)  printf("[DEBUG] %s, %s(), line:%d, msg:" fmt, __FILE__, __func__, __LINE__, ##__VA_ARGS__)

Tom Kuschel 的版本

1
2
3
4
5
6
7
8
#define DEBUG 3

#if defined(DEBUG) && DEBUG > 0
#define DEBUG_PRINT(fmt, ...) fprintf(stderr, "[DEBUG] %s:%d:%s(): " fmt, \
__FILE__, __LINE__, __func__, ##__VA_ARGS__)
#else
#define DEBUG_PRINT(fmt, ...) // Don't do anything in release builds
#endif

以下為我的版本, DEBUG 可以定義不同數字等級, 決定輸出的訊息種類.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define DEBUG 4
#if defined(DEBUG)
#if DEBUG >= 4 // filename:function:line
#define DEBUG_PRINT(fmt, ...) fprintf(stderr, "[DEBUG] %s:%s():%d " fmt, \
__FILE__, __func__, __LINE__, ##__VA_ARGS__)
#elif DEBUG >= 3 // filename:function
#define DEBUG_PRINT(fmt, ...) fprintf(stderr, "[DEBUG] %s:%s() " fmt, \
__FILE__, __func__, ##__VA_ARGS__)
#elif DEBUG >= 2 // filename:line
#define DEBUG_PRINT(fmt, ...) fprintf(stderr, "[DEBUG] %s:%d " fmt, \
__FILE__, __LINE__, __func__, ##__VA_ARGS__)
#elif DEBUG >= 1 // function:line
#define DEBUG_PRINT(fmt, ...) fprintf(stderr, "[DEBUG] %s():%d " fmt, \
__func__, __LINE__, ##__VA_ARGS__)
#endif
#else
#define DEBUG_PRINT(fmt, ...) // Don't do anything in release builds
#endif

使用

1
2
DEBUG_PRINT("Debugging is enabled.\n");
DEBUG_PRINT("Debug level: %d", (int) DEBUG);


20180220 updated: libusbmuxd 另一種用法


20190409 updated: 新增顯示檔名

1
2
3
4
5
#include <string.h>
// 提醒:For Windows use '\\' instead of '/'.
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
// function() filename:line
#define DRBUG_PRINT(fmt, ...) do { fprintf(stderr, "[DEBUG] %s() %s:%d " fmt, __FUNCTION__, __FILENAME__, __LINE__, ##__VA_ARGS__); } while(0)

其它相關文章推薦
C/C++ 新手入門教學懶人包