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增加调试信息
-
方法1:
$(info, "here add the debug info")
但是此不能打印出.mk的行号 -
方法2:
$(warning, "here add the debug info")
-
方法3:
$(error, "error: this will stop the compile")
这个可以停止当前makefile的编译 -
方法4:
$(info, $(TARGET_DEVICE))
打印变量的值
II. 使用echo增加调试信息(echo只能在target:后面的语句中使用,且前面是个TAB)
-
方法1:
@echo "start the compilexxxxxxxxxxxxxxxxxxxxxxx"
-
方法2:
@echo $(files)
字体颜色控制
格式: 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 | 显示光标 |