C语言类调试技巧

1 使用不同的颜色打印调试信息,区分调试等级.

#include <stdio.h>
#include <stdarg.h>

//仅仅是打印函数名字替换 DEBUG <--> printf
#define DEBUG(format, ...) printf(format, ##__VA_ARGS__)

//替换打印函数,在打印出来的内容加上前缀
#define XFUNC_PRINT(format, arg...) printf("XFUNC: " format "", ##arg)

//名字替换,并在打印出来的内容加上前缀,同时加入定位的功能。
#define TRC_P(fmt, args...) fprintf(stderr,"  TRC_P(%s:%d):\t" fmt, __func__, __LINE__, ##args)

//名字替换,并在打印出来的内容加上前缀,同时加入定位的功能,并让打印的前缀具备特殊颜色(\033[1;32m  \033[0m这些表示颜色,\t一定程度上使屏幕输出对齐)
#define TRC_PG(fmt, args...) fprintf(stderr, "\033[1;32m  TRC_PG(%s:%d):\t\033[0m" fmt, __func__, __LINE__, ## args)

//名字替换,并在打印出来的内容加上前缀,同时加入定位的功能,并让打印的前缀具备特殊颜色
#define TRC_PR(fmt, args...) fprintf(stderr, "\033[1;31m  TRC_PR(%s:%d):\t\033[0m" fmt, __func__, __LINE__, ## args)

int main(void)
{    
    int i= 0;    
    
    DEBUG("hello,%d\n",i++);    
    XFUNC_PRINT("hello,%d\n",i++);    
    TRC_P("hello,%d\n",i++);    
    TRC_PG("hello,%d\n",i++);    
    TRC_PR("hello,%d\n",i++);    
    
    return0;
}
    
/*
[root@localhost jz2440]# gcc test.c ;./a.out 
hello,0
XFUNC: hello,1  
TRC_P(main:27):       hello,2  
TRC_PG(main:28):      hello,3  ----这里前缀是绿色的  
TRC_PR(main:29):      hello,4  ----这里前缀是红色的
*/

2 以不同格式打印数据.

#include <stdio.h>

//以十六进制打印一个数val的值,输出格式为val=0x...
#define HEX_PI(VAL)\
do{\
    printf(#VAL"=%#x,fuc:%s,line:%d\n", VAL, __FUNCTION__, __LINE__);\
}while(0)

//以十进制打印一个数val的值,输出格式为val=...
#define DEC_PI(VAL)\
do{\
    printf(#VAL"=%#d,fuc:%s,line:%d\n", VAL, __FUNCTION__, __LINE__);\
}while(0)    

void main(void){    
int i = 123;    
int j = 123;    
HEX_PI(i);    
HEX_PI(j);            

DEC_PI(i);    	
DEC_PI(j);
}

//i=0x7b,fuc:main,line:17
//j=0x7b,fuc:main,line:18
//i=123,fuc:main,line:20
//j=123,fuc:main,line:21

3 配合宏开关在编译前静态指定打印等级

#if CUR_PLEVEL > 5
#define TRC_PR(fmt, args...) fprintf(stderr," TRC_P(%s:%d):\t" fmt, __func__, __LINE__, ##args)
#endif

Makefile调试信息输出

I. 使用info/warning/error增加调试信息

II. 使用echo增加调试信息(echo只能在target:后面的语句中使用,且前面是个TAB)


字体颜色控制

格式: echo -e “\033[字背景颜色;字体颜色m字符串\033[0m”

例如:

echo -e "\033[41;36m something here \033[0m" 

其中41的位置代表底色, 36的位置是代表字的颜色

那些ascii code 是对颜色调用的始末.
\033[ ; m …… \033[0m

字背景颜色范围:40———49
40:   $\color{#000000}{黑色}$
41:   $\color{#880000}{深红}$
42:   $\color{#00ff00}{绿色}$
43:   $\color{#dddd00}{黄色}$
44:   $\color{#0000ff}{蓝色}$
45:   $\color{#ff00ff}{紫色}$
46:   $\color{#007700}{深绿}$
47:   $\color{#bbbbbb}{白色}$

字颜色:30———39
30:   $\color{#000000}{黑色}$
31:   $\color{#ff0000}{红色}$
32:   $\color{#00ff00}{绿色}$
33:   $\color{#dddd00}{黄色}$
34:   $\color{#0000ff}{蓝色}$
35:   $\color{#ff00ff}{紫色}$
36:   $\color{#008800}{深绿}$
37:   $\color{#bbbbbb}{白色}$

======ANSI控制码的说明=========================================

\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m – \33[37m 设置前景色
\33[40m – \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH 设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标