VC开发中三种调试技术

来源:互联网 发布:wlan 数据分流技术 编辑:程序博客网 时间:2024/05/17 03:07

一、调试信息输出到本地文件

(1) 实现思路是定义一个变参函数 TraceLog(char * lpszFormat,...),作用是将传入的格式话字符串写入到本地文件TraceLog.txt中,在程序开发中能够随时调用并写入调试信息。

    如:

int number=123;

TraceLog("hello world %d",number);

可以将调试信息“hello world 123”写入到TraceLog.txt中。

实现源码如下:

void TraceLog(char* lpszFormat, ...)
{
va_list args; //声明va_list变量,通常情况下va_list宏就是char*
char sTemp[512] = "";


va_start(args, lpszFormat);//用格式化字符串初始化args,获取可变参数列表中第一个参数的地址
_vsnprintf(sTemp, sizeof(sTemp), lpszFormat, args);//将格式化字符串以及可变参数内容打印进sTemp
va_end(args);//清空args


//日期
SYSTEMTIME sysTime;
::GetLocalTime(&sysTime);


char sTrace[1024] = "";
sprintf(sTrace, "[%02u:%02u:%02u: %02u:%02u:%02u] %s\r\n"
, sysTime.wYear, sysTime.wMonth, sysTime.wDay
, sysTime.wHour, sysTime.wMinute, sysTime.wSecond
, sTemp);


//输出到文件
FILE* pFile = NULL;
pFile = fopen("C:\\TraceLog.txt", "a");
fwrite(sTrace, 1, strlen(sTrace), pFile);
fclose(pFile);
pFile = NULL;
}

(2) 函数中声明va_list 类型的变量args,该变量用于存储TraceLog函数中可变参数列表的第一个参数的地址,va_list是一个宏,在一般情况下为char*。

(3) va_start(args, lpszFormat),用va_start宏初始化args变量,即把TraceLog函数中可变参数列表的第一个参数的地址赋给args。

(4) _vsnprintf(sTemp, sizeof(sTemp), lpszFormat, args)该函数的功能是将格式化字符串传给sTemp,该函数的有4个参数,第一个参数是目的char型数组,第二个参数是最大支持的传入的字节数,第三个参数是格式化字符串,第四个参数是第一个可变参数的地址。

(5) va_end(args);函数和 va_start(args, lpszFormat)必须成对出现,作用是清空args。


二、调试信息输出到debug窗口

该方法的实现思路很简单,利用TRACE宏,该宏是MFC中提供给用户的调试宏,用五种形式:

#define TRACE               ::AfxTrace
#define TRACE0(sz)              ::AfxTrace(_T("%s"), _T(sz))
#define TRACE1(sz, p1)          ::AfxTrace(_T(sz), p1)
#define TRACE2(sz, p1, p2)      ::AfxTrace(_T(sz), p1, p2)
#define TRACE3(sz, p1, p2, p3)  ::AfxTrace(_T(sz), p1, p2, p3)

使用方法如下:

最通用的用法:TRACE(格式化字符串,参数1,...)

后面不加参数:TRACE0(格式化字符串)

后面加1参数:TRACE1(格式化字符串,参数1)

后面加1参数:TRACE2(格式化字符串,参数1,参数2)

后面加1参数:TRACE3(格式化字符串,参数1,参数2,参数3)


要注意的是:

1、建议使用TRACE宏,比较通用,其他几种使用不方便

2、该宏智能在debug版本中使用,release版本中无效

3、输出信息直接在IDE的“输出”窗口查看

4、该宏在一个工程中最多使用200次


三、输出调试信息到控制台窗口

步骤一:AllocConsole()为进程分配一个新的控制台

步骤二:定义全局变量HANDLE hOutputHandle

步骤三:获取标准输出句柄hOutputHandle=GetStdHandle(STD_OUTPUT_HANDLE);

步骤四:向标准输出窗口输出调试信息:writeconsole(hOutputHandle,buff,sizeof(buff),number,NULL);


0 0
原创粉丝点击