C语言代码跟踪调试

原文:http://blog.csdn.net/zhijun198811/article/details/17347423

在linux编程中,当文件数量变的众多之后,使用gdb调试就是一场灾难。因此在程序中加入合理的打印信息,定位错误出现的文件名,函数名,行号等信息,能更高效的定位到问题的所在。

     下面定义了宏,分别是WARNING,INFO,ERROR,SHOW_TIME,DEBUG等。利用了 __FILE__,_FUNCTION__, __LINE__等变量。。。

      _FILE____FUNCTION__ __LINE__ 从名字可以直接看出来了,对应的:代码文件函数 行号


     下面就是定义的宏:

[cpp] view plain copy print ?
  1. #define ERROR(...) /    
  2. do{ /    
  3.     fprintf(stderr, "[ERROR  ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /    
  4.     fprintf(stderr, __VA_ARGS__); /    
  5. }while(0)    
  6.     
  7. #define WARNING(...) /    
  8. do{ /    
  9.     fprintf(stdout, "[WARNING]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /    
  10.     fprintf(stdout, __VA_ARGS__); /    
  11. }while(0)    
  12.     
  13. #define INFO(...) /    
  14. do{ /    
  15.     fprintf(stdout, "[INFO  ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /    
  16.     fprintf(stdout, __VA_ARGS__); /    
  17. }while(0)    
  18.     
  19.     
  20. #define SHOW_TIME(...) /    
  21. do{/    
  22.     extern unsigned long long gLatestTime;/    
  23.     timeval tp;/    
  24.     gettimeofday(&tp, NULL);/    
  25.     unsigned long long now = tp.tv_sec*1000000+tp.tv_usec; /    
  26.     if(gLatestTime != 0) /    
  27.     { /    
  28.         fprintf(stdout, ">>>>>>>>>Used Time: %s[%d], %s: %ld.%ld, %llu ms ", __FILE__, __LINE__, __func__, tp.tv_sec, tp.tv_usec, (now-gLatestTime)/1000);/    
  29.         fprintf(stdout, __VA_ARGS__); /    
  30.         fprintf(stdout, "/n"); /    
  31.     } /    
  32.     gLatestTime = now;/    
  33. }while(0)    
  34.     
  35.     
  36. #ifdef DEBUG    
  37. #define DBG(...) /    
  38. do{ /    
  39.     fprintf(stdout, "[DEBUG  ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /    
  40.     fprintf(stdout, __VA_ARGS__); /    
  41. }while(0)    
  42. #else    
  43. #define DBG(...)    
  44. #endif   
[cpp] view plain copy print ?
  1. #define ERROR(...) /    
  2. do{ /    
  3.     fprintf(stderr, "[ERROR  ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /    
  4.     fprintf(stderr, __VA_ARGS__); /    
  5. }while(0)    
  6.     
  7. #define WARNING(...) /    
  8. do{ /    
  9.     fprintf(stdout, "[WARNING]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /    
  10.     fprintf(stdout, __VA_ARGS__); /    
  11. }while(0)    
  12.     
  13. #define INFO(...) /    
  14. do{ /    
  15.     fprintf(stdout, "[INFO  ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /    
  16.     fprintf(stdout, __VA_ARGS__); /    
  17. }while(0)    
  18.     
  19.     
  20. #define SHOW_TIME(...) /    
  21. do{/    
  22.     extern unsigned long long gLatestTime;/    
  23.     timeval tp;/    
  24.     gettimeofday(&tp, NULL);/    
  25.     unsigned long long now = tp.tv_sec*1000000+tp.tv_usec; /    
  26.     if(gLatestTime != 0) /    
  27.     { /    
  28.         fprintf(stdout, ">>>>>>>>>Used Time: %s[%d], %s: %ld.%ld, %llu ms ", __FILE__, __LINE__, __func__, tp.tv_sec, tp.tv_usec, (now-gLatestTime)/1000);/    
  29.         fprintf(stdout, __VA_ARGS__); /    
  30.         fprintf(stdout, "/n"); /    
  31.     } /    
  32.     gLatestTime = now;/    
  33. }while(0)    
  34.     
  35.     
  36. #ifdef DEBUG    
  37. #define DBG(...) /    
  38. do{ /    
  39.     fprintf(stdout, "[DEBUG  ]%s %s(Line %d): ",__FILE__,__FUNCTION__,__LINE__); /    
  40.     fprintf(stdout, __VA_ARGS__); /    
  41. }while(0)    
  42. #else    
  43. #define DBG(...)    
  44. #endif   


         以上是定义的输出文件信息,如果想输出自定义的字符串(类似printf()的功能),可以使用可变参的形式传递。

        如上面的的最后一个DEBUG的定义:

        fprintf(stdout , __VA_ARGS__); 

        这行代码使得用户可以将自己的信息放在可变参里面,例如:DBG("  I am from  %s " , "ICT"); 这句话的输出分成两部分前半部分打印文件名、函数名、行号,后半部分会输出: I am from ICT  这句话。可变参给用户提供了很好的自定义空间。 

       <将在下一篇博文中介绍一下" 可变参 "的用法>

 
   说明:
       stdout -- 标准输出设备 (printf("..")) 同 stdout。 
        stderr -- 标准错误输出设备 两者默认向屏幕输出。 

        但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。



其他相关文档:

http://www.cnblogs.com/lixiaohui-ambition/archive/2012/08/21/2649052.html

http://www.cnitblog.com/zouzheng/archive/2007/08/31/32691.html

http://hi.baidu.com/izouying/item/e87976fc11969b16fe358210

http://blog.sina.com.cn/s/blog_701958320101aed9.html



你可能感兴趣的:(STM32,stm32,usart,printf,debug)