使用C++进行MFC程序调试时,有时我们需要查看某个变量的实时值,或者需要查看程序此时的运行状态。那么就需要输出某些调试信息,方便跟踪变量及了解程序的与运行状态。但是直接使用printf是无法输出信息的,下面介绍一下这两种下如何输出调试信息。
1.MFC调试(F5)状态下输出调试信息:
直接使用TRACE()
例如:
设置断点,直接按下[F5],单步运行,同时观察调试窗口的输出(可以先把窗口清空以便观察),输出结果如图:
这就是在Debug调试模式下的输出,
注意:TRACE在直接运行下无法输出,只有调试模式下才可以输出。
2.MFC运行状态(Ctrl+F5)下打印输出信息:
使用printf()输出,但有个前提:需要在输出信息前写上两个语句:
AllocConsole();
// 为当前的窗口程序申请一个Console窗口 返回非零值:调用成功,返 回0,不成功
freopen(“CONOUT$”, “w”, stdout);
// 重新分配文件指针,以实现重定向。可重定向的流有:标准输入流、标准输出流或者标准错误流。
其中"CONOUT$"是指代当前console的特殊字符串,"w"表明以written模式打开这个console,stdout指代标准输出流。
运行后就会打开一个cmd窗口,然后就可以正常使用printf()输出信息
可以在初始化函数OnInitDialog()处调用一次,然后在需要输出的地方直接输出即可。
以下是一个完整的例子:
各个按钮的函数:
//显示调试信息:重定向
void CCPrintDlg::OnBtnshowprint()
{
PrintMessage();
}
//开始状态按钮
void CCPrintDlg::OnBtnstart()
{
printf("Start\n");
}
//结束状态按钮
void CCPrintDlg::OnBtnstop()
{
printf("Stop\n");
}
//辅组:清除屏幕按钮
void CCPrintDlg::OnBtnclear()
{
system("cls");
}
//设定窗口位置:宽高
void CCPrintDlg::OnSetSize()
{
//AllocConsole函数不能改变控制台窗口在屏幕上的位置、尺寸等属性。
//可以用SetConsoleWindowInfo来改变控制台窗口大小
using namespace std;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SMALL_RECT rc;
rc.Left = 5;
rc.Top = 5;
rc.Right = 54;
rc.Bottom = 24;
SetConsoleWindowInfo(hOut, TRUE, &rc);//此时窗口的宽度为50,高度为20
}
//显示调试信息具体实现:重定向
void CCPrintDlg::PrintMessage()
{
AllocConsole(); //AllocConsole函数的功能是为当前的窗口程序申请一个Console窗口 返回非零值:调用成功,返回0,调用不成功
freopen("CONOUT$", "w", stdout); // freopen函数用来替换一个流,或者说重新分配文件指针,以实现重定向。可重定向的流有:标准输入流、标准输出流或者标准错误流。
//FILE *freopen(const char *path, const char *mode, FILE *stream);
//其中"CONOUT$"是指代当前console的特殊字符串,"w"表明以written模式打开这个console,stdout指代标准输出流。
std::cout << "调试输出窗口已打开" << std::endl;
}
运行结果: