trace的用法小结

首先要说明:前面一部分是直接复制粘贴的http://blog.163.com/loveyingchun_1314/blog/static/23824251201221510434915/的内容。

TRACE宏对于VC下程序调试来说是很有用的东西,有着类似printf的功能;该宏仅仅在程序的DEBUG版本中出现,当RELEASE的时候该宏就完全消失了,从而帮助你调试也在RELEASE的时候减少代码量。相当于

1 #ifdef _DEBUG 
2 AfxDump<<"string in trace ...\n"; 
3 #endif   

使用非常简单,格式如下:
 1 TRACE("DDDDDDDDDDD"); 2 TRACE("wewe%d",333); 
同样还存在TRACE0,TRACE1,TRACE2。。。分别对应0,1,2。。个参数

TRACE信息输出到VC IDE环境的输出窗口(该窗口是你编译项目出错提示的哪个窗口),但仅限于你在VC中运行你的DEBUG版本的程序。

小提示:在Unicode调试下,TRACE0, TRACE1, TRACE2, and TRACE3宏更容易使用,因为不需要使用_T宏。

TRACE0 
TRACE0( exp ) 
参数exp :A format string as used in the run-time function printf. 
TRACE0,只能输出格式化字符串。
TRACE1,输出带一个参数的字符串。
TRACE2,输出带两个参数的字符串。
TRACE3,输出带三个参数的字符处。

例如:

int i = 10;
char sz[] = "123";
float f = 1.2;

TRACE0("This is a macro for debugging!");
TRACE1("This is a macro for debugging! %d", i);
TRACE2("This is a macro for debugging! %d, %s", i, sz);
TRACE3("This is a macro for debugging! %d, %s, %f", i, sz, f);

//TRACE0 does nothing if you have compiled a release version of //your application. As with TRACE, it only dumps data to afxDump if //you have compiled a debug version of your application. 
//Note This macro is available only in the debug version of MFC. 
//Example example for TRACE0 
TRACE0( "Start Dump of MyClass members:" );

2.在MFC之外使用TRACE

记得原来尝试学MFC的时候觉得有一个TRACE可以在Debug时向VS的调试输出窗口输出字串符,用来调试时跟踪变量很方便。

然则如果不是MFC项目或者ATL的项目的话是不能使用这个宏的。这时有一个没有什么额外消耗的办法能够做到向调试输出窗口输出。

法1:在项目属性-》配置属性-》常规-》MFC的使用,设置为在共享中使用MFC

法2:在项目中额外包含windows.h这个头文件,再使用OutputDebugString()这个函数就能够起到与TRACE()宏相同的效果。在进行一点包装就能和c中的printf一样接受不定项参数。

 1 #include <iostream>
 2 #include <windows.h>
 3  using namespace std;
 4  bool _trace(TCHAR *format, ...)
 5  {
 6     
 7      TCHAR buffer[1000];
 8      va_list argptr;
 9      va_start(argptr, format);
10      wvsprintf(buffer, format, argptr);
11      va_end(argptr);
12      OutputDebugString(buffer);
13      return true;
14 }
15  int main()
16  {
17     int test = 5;
18     _trace("hi output:%d", test);
19     int a;
20     cin >> a;
21  }
22  //在vs2005中编译运行后在Output窗口输出"hi output : 5"

 

3.如果想把信息写入文件,同时对不同的类型信息进行分级标识,可以编写如下函数

定义变量:

 1 /* debug trace functions */
 2 #define TRACE  //定义TRACE,使其能够输出故障信息等
 3 #ifdef TRACE
 4 
 5 static FILE *fp_trace=NULL;     /* file pointer of trace */
 6 static char file_trace[1024];   /* trace file */
 7 static int level_trace=0;       /* level of trace */
 8 static unsigned int tick_trace=0; /* tick time at traceopen (ms) */
 9 static gtime_t time_trace={0};  /* time at traceopen */
10 static lock_t lock_trace;       /* lock for trace */
 1 extern void traceclose(void)   //use
 2 {
 3     if (fp_trace&&fp_trace!=stderr) fclose(fp_trace);
 4     fp_trace=NULL;
 5     file_trace[0]='\0';
 6 }
 7  extern void traceopen(const char *file)
 8 {
 9      gtime_t time=utc2gpst(timeget()); 
10      if (!*file||!(fp_trace=fopen(file,"w"))) fp_trace=stderr;
11      strcpy(file_trace,file);
12      tick_trace=tickget();
13      time_trace=time;
14      initlock(&lock_trace);
15  }
16  
17  extern unsigned int tickget(void)
18  {
19  #ifdef WIN32
20      return (unsigned int)timeGetTime();
21  #else
22
 1 extern void tracelevel(int level)   //use
 2 {
 3     level_trace=level;
 4 }
 5 extern void trace(int level, const char *format, ...) //use
 6 {
 7     va_list ap;
 8     
 9     /* print error message to stderr */
10     if (level<=1) {
11         va_start(ap,format); vfprintf(stderr,format,ap); va_end(ap);
12     }
13     if (!fp_trace||level>level_trace) return;15     fprintf(fp_trace,"%d ",level);
16     va_start(ap,format); 
17     vfprintf(fp_trace,format,ap); 
18     va_end(ap);
19     fflush(fp_trace);
20 }

 

调用形式:

1 traceopen(tracefile);
2 tracelevel(level);
3 trace(3,"readobsnav: ts=%s n=%d\n",time_str(ts,0),n);
4 trace(1,"no obs data\n");
5 trace(1,"no nav data\n");
6 ……………………

 

posted @ 2016-04-20 15:01  shaoxiaodong92  阅读(1900)  评论(0编辑  收藏  举报