Linux 程序开发打印 Debug 信息的使用技巧

转载 2016年06月02日 00:14:16

      coding 最重要的是如何debugdebug 当然就少不了把程序信息输出,如何清晰明了地打印出程序信息,可以快速判断程序运行情况,定位程序出问题的地方。先来一段代码实战下再说:

 

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>

  4. #ifndef __USE_DEBUG
  5. #define __USE_DEBUG

  6. #define USE_DEBUG
  7. #ifdef USE_DEBUG
  8. #define DEBUG_LINE()    printf("[%s:%s] line=%d\r\n",__FILE__, __func__, __LINE__)
  9. #define DEBUG_ERR(fmt, args...)    printf("\033[46;31m[%s:%d]\033[0m "#fmt" errno=%d, %m\r\n", __func__, __LINE__, ##args,errno, errno)
  10. #define DEBUG_INFO(fmt, args...)    printf("\033[33m[%s:%d]\033[0m "#fmt"\r\n", __func__, __LINE__, ##args)
  11. #else
  12. #define DEBUG_LINE()
  13. #define DEBUG_ERR(fmt, ...)
  14. #define DEBUG_INFO(fmt, ...)
  15. #endif

  16. #endif

  17. void func()
  18. {
  19.         DEBUG_LINE();
  20.         DEBUG_INFO("Garfield test DEBUG_INFO() d: %d ; s: %s", 1 , __FUNCTION__);
  21.         DEBUG_ERR("Garfield test DEBUG_ERR() d: %d ; s: %s", 2 , __FUNCTION__);
  22. }

  23. int main(int argc,char **argv)
  24. {
  25.         func();

  26.         return 0;
  27. }

分析:

1,  使用颜色打印调试信息:

 

  1. printf("\033[46;31m[%s:%d]\033[0m "#fmt" errno=%d, %m\r\n", __func__, __LINE__, ##args, errno, errno);

上面printf时在Linux 命令行下打印出带颜色的字体,方便一眼区分不同种类的调试信息,只需要加上一些颜色代码,例如:这里的46代表底色, 31代表字体的颜色。

使用ascii code 是对颜色调用的始末格式如下:

 

  1. \033[ ; m …… \033[0m

后面哪个 ”\033[0m” 是对前面哪个颜色载入的结束,恢复到终端原来的背景色和字体色,可以把后面哪个修改成如下试试:

 

  1. #define DEBUG_ERR(fmt, args...) printf("\033[46;31m[%s:%d]\033[40;37m "#fmt" errno=%d, %m\r\n", __func__, __LINE__, ##args, errno, errno);

下面列出 ascii code 的颜色值:

    字背景颜色范围:40----49                            字颜色:30-----------39

         40:                                                             30:

         41:深红                                                         31:

         42:绿                                                             32:绿

         43:黄色                                                         33:

         44:蓝色                                                         34:蓝色

         45:紫色                                                         35:紫色

         46:深绿                                                         36:深绿

         47:白色                                                         37:白色

 

2,   打印调试信息的跟踪位置:

 

  1. printf("[%s:%s] line=%d\r\n",__FILE__, __func__, __LINE__);
  2. printf("\033[33m[%s:%d]\033[0m "#fmt"\r\n", __func__, __LINE__, ##args);

         如上代码:

1__FILE__ 打印出调试信息所在的文件名;

2__func__ 将会打印出调试信息所在的函数名;

3__LINE__ 将会打印出调试信息所在文件的行号;

 

3,   使用不定参数向打印信息里面加入自己想看到的调试信息:

 

  1. #define DEBUG_INFO(fmt, args...) printf("\033[33m[%s:%d]\033[0m "#fmt"\r\n", __func__, __LINE__, ##args);

    调用方式如下:

 

  1. int i = 110;
  2. char * s = “hello world!”;
  3. DEBUG_INFO("Garfield test DEBUG_INFO() d: %d ; s: %s", i , s);

         至于不定数量参数宏与不定参数函数的使用就没神马好说的啦,自己去google吧!

 

下面引用一位大侠的blog,列出一些常用的debug 语句:

出自:http://blog.mcuol.com/User/luoming/Article/16499_1.htm

 

  1. #ifdef DEBUG
  2. #define F_OUT printf("%s:", __FUNCTION__);fflush(stdout);
  3. #define L_OUT printf("%s:%d:", __FILE__, __LINE__);fflush(stdout);
  4. #define A_OUT printf("%s:%d:%s:", __FILE__, __LINE__, __FUNCTION__);fflush(stdout);
  5. #define D_OUT printf("DEBUG:");fflush(stdout);

  6. #define F_PRINTF(fmt, arg...) F_OUT printf(fmt, ##arg)
  7. #define L_PRINTF(fmt, arg...) L_OUT printf(fmt, ##arg)
  8. #define A_PRINTF(fmt, arg...) A_OUT printf(fmt, ##arg)
  9. #define PRINTF(fmt, arg...) D_OUT printf(fmt, ##arg)
  10. #define DBUG(a) {a;}
  11. #else
  12. #define F_OUT
  13. #define L_OUT
  14. #define A_OUT
  15. #define D_OUT

  16. #define F_PRINTF(fmt, arg...)
  17. #define L_PRINTF(fmt, arg...)
  18. #define A_PRINTF(fmt, arg...)
  19. #define PRINTF(fmt, arg...)
  20. #define DBUG(a)
  21. #endif

  22. #define F_PERROR(fmt) F_OUT perror(fmt)
  23. #define L_PERROR(fmt) L_OUT perror(fmt)
  24. #define A_PERROR(fmt) A_OUT perror(fmt)
  25. #define PERROR(fmt) D_OUT perror(fmt)

转载于:

http://blog.chinaunix.net/uid-20671208-id-3013780.html 


Linux 程序开发打印 Debug 信息的使用技巧--C语言中几种输出调试信息的方法

Linux 程序开发打印 Debug 信息的使用技巧
  • u011104799
  • u011104799
  • 2014年08月23日 15:25
  • 2910

Linux 程序开发打印 Debug 信息的使用技巧

少废话,coding 最重要的是如何debug,debug 当然就少不了把程序信息输出,如何清晰明了地打印出程序信息,可以快速判断程序运行情况,定位程序出问题的地方。先来一段代码实战下再说:   ...
  • zhuzeji
  • zhuzeji
  • 2014年12月26日 15:34
  • 234

Linux 程序开发打印Debug 信息的使用技巧

转载地址:http://blog.chinaunix.net/uid-20671208-id-3013780.html coding 最重要的是如何debug,debug 当然就少不了把程序信息输出...
  • dongqing27
  • dongqing27
  • 2015年11月17日 11:19
  • 195

linux 程序开发打印 debug()

coding 最重要的是如何debug,debug 当然就少不了把程序信息输出,如何清晰明了地打印出程序信息,可以快速判断程序运行情况,定位程序出问题的地方。先来一段代码实战下再说:   ...
  • wei_xiaox126
  • wei_xiaox126
  • 2015年10月12日 19:31
  • 686

c和C++的调试打印输出方法

#define     ERR_DEBUG_SWITCH        1 #ifdef    ERR_DEBUG_SWITCH #define pr_err(fmt,args...) print...
  • xuan1986
  • xuan1986
  • 2016年08月13日 15:49
  • 894

【Linux】【Debug】一个简单的debug信息输出方法

Linux debug
  • vickytong1018
  • vickytong1018
  • 2017年06月23日 17:08
  • 488

python访问的时候,将debug信息打印出来

import urllib2 httpHandler = urllib2.HTTPHandler(debuglevel=1) httpsHandler = urllib2.HTTPSHandler(d...
  • shaowei213
  • shaowei213
  • 2014年07月30日 23:24
  • 848

linux内核调试日志开关-让pr_debug输出

1、让pr_debug能输出 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -59,7 +59,7 @@ ...
  • longxiaowu
  • longxiaowu
  • 2015年03月26日 14:18
  • 7931

uboot中最低等级的打印开关如何打开呢?

最近呢,别的同事嫌弃他用的uboot的打印信息多的令人发指,连向flash里拷贝一个字节都要打印一条信息的那种。。。 我很不幸地被他叫去把这些打印信息关掉,因为全部打开的话,容易让uboot跑死。。...
  • clmngu
  • clmngu
  • 2016年12月28日 20:42
  • 1166

关于内核打印信息的查看

第一个ipc_logging cat sys/kernel/debug/ipc_logging/xxxx/xxx 第二个 此外,打印中还经常看到pr_debug函数,可以动态的打印调试信...
  • LEAD_SOLO
  • LEAD_SOLO
  • 2017年04月13日 17:24
  • 377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux 程序开发打印 Debug 信息的使用技巧
举报原因:
原因补充:

(最多只允许输入30个字)