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 ……………………