VC调试--输出调试字符串(含示例代码)

本文介绍了如何在MFC程序中实现一个强大的自定义trace宏,可以实时输出调试信息,适应多种数据类型,并提供多种功能,如自动添加变量名、格式化字符串、输出系统错误代码等。通过包含特定的头文件,可以在DEBUG和RELEASE模式下选择性地启用或禁用输出。此外,程序还会在退出时将调试信息保存到文本文件,便于后续查看和分析。
摘要由CSDN通过智能技术生成

 

VC调试 输出字符串

更新日期:2012-11-7
代码下载:trace.zip (请不要直接使用迅雷下载) 或者到邮箱下载: vcshare@ qq.com(密码:share88)

测试环境:vs2008+WinXP
图片预览:

 

 

 

 

━━━━━━━━━━━━━━━━━━━━━━━━
前言
    一开始学习C++时,在控制台下写程序做练习,很容易输出程序变量,所以调试很方便。之后学习编写MFC程序,程序运行时要实时查看变量的情况就很麻烦 了,虽然有TRACE宏(这个也是后来才知道的),但必须是程序结束后才能查看,而且阅读起来也很费劲。最开始自己写了个简陋的dis()函数(请看本文 后面的附录),很简单,几行代码往程序一粘贴,再调用dis函数就可以显示字符串和int变量了。但后面输出的变量会覆盖之前的变量,所以还是不方便。于 是一直在寻找一种输出变量更好的方法,偶然的情况下在网上下载了个DebugView.exe(下载),试了一下,就觉爱不释手。TRACE输出的变量实 时地显示在DebugView上,给调试带来了更多的方便。本来以为是这已经是终极好方法,谁知又在偶然的情况下,看到一位高手写的一段代码,可以很简单 的将变量输出到控制台窗口,比起用DebugView的方法是更甚一筹了。之后自己再做了些研究,不断改进,力求简单傻瓜,终于有了一个较为满意的解决法 案了。现在拿出来很大家分享。希望对你有所帮助。阿弥陀佛!

━━━━━━━━━━━━━━━━━━━━━━━━

(一)功能:
    输出调试变量(类似于TRACE)

(二)特点:
    1.可以自动适应参数的类型(最主要依赖于ostringstream)
    2.可以自动适应输入参数的个数。(关闭了编译提醒 #pragma warning(disable: 4003) )
    3.会在输出的变量值前面自动添加变量的名称,方便查看
    4.程序创建Edit窗口用于输出转换后的字符串。
    5.程序退出时会将输出字符串保存到工程目录下的DebugData.txt。方便查看
    6.多种编译模式,比如可让DEBUG和Release版本都能输出调试变量或者两者都不输出
    7.支持UNICODE,WIN32,Dll,MFC

(三)使用说明:
    1.把trace.h复制到工程目录下(可以不添加到工程)。
    2.在"stdafx.h"里包含头文件 #include "trace.h"。之后就可以使用trace()宏了。
    3.所有输出的字符串会保存在工程目录下的"DebugData.txt"文件,以方便查看
    4.我把所有代码都放在一个头文件里,虽然不合符规范,但这样使用起来很方便。
    5.trace(x,y,z,w)宏原本有4个参数,当参数不如时,编译器会给出警告,所以我使用
        #pragma warning(disable: 4003) 把这个编译警告给关掉了。

(四)可以使用的宏:
    trace(X,Y,Z,W)    //输出常用类型变量,如int、double、short、POINT、RECT、string
                    //且自动适应变量的个数(变量数为1-4个)
    tracef()        //格式化字符串,类似sprintf
    traceLastError()//输出系统错误代码,调用了GetLastError()
    traceRel(X,Y)     //当X=true,输出"Y: successful" ; x=false,输出"Y: failed"
    traceClear()    //清空窗口

(五)关于trace宏使能设置:
    1.默认情况下 NO_TRACE_WINDOW 和 TRACE_WINDOW都没定义,则
      DEBUG版本会输出调试字符串,而Release版本不会
    2.如果开头定义了#define NO_TRACE_WINDOW
      DEBUG版本和Release版本都不会输出输出调试字符串
    3.如果开头定义了#define TRACE_WINDOW
      DEBUG版本和Release版本都会输出输出调试字符串
    4.每次修改上面2个宏后需要全部重新编译才会生效

(六)调用示例:
    void CDemoDlg::OnButton1() 
    {
        int a=45; double b=67.45; double c=847.424;short d=324;
        RECT rect;
        ::GetWindowRect(m_hWnd,&rect);
        HWND hWnd=::GetForegroundWindow();
        POINT point;
        GetCursorPos(&point);
        bool ak=true;
        CPoint cpoint(88,421);
        CRect crect(19,423,56,522);
        CString mfcstr=_T("mfc CString");
        TCHAR buf[100]=_T("c style string"); 

    #ifdef _UNICODE
        wstring stlstr=_T("stl string");
    #else
        string stlstr=_T("stl string");
    #endif

        tracef(_T("tracef 类似于 %s"),_T("sprintf")); //格式化字符串,类似sprintf
        trace(_T("Impossible is nothing"));
        trace(stlstr);   //输出字符串
        trace(mfcstr);   //输出字符串
        trace(buf);   //输出字符串
        trace(a);        //输出int
        trace(a,b);        //输出int和double
        trace(a,b,c);
        trace(a,b,c,d);
        trace(point);    
        trace(point,cpoint);    //输出POINT 和 CPoint    
        trace(rect);
        trace(rect,crect);        //输出RECT 和 CRect
        trace(hWnd);            //输出窗口信息
        traceLastError();        //输出系统错误代码        
        traceRel(ak==true,"func()");  //当X=true,输出"Y: successful" ; x=false,输出"Y: failed"
    }

 

 

 

trace.h 代码,复制后保存为“trace.h",之后#include "trace.h" 就可以使用了

━━━━━━━━━━━━━━━━━━━━━━━━

 

 

/*==================trace 输出调试字符串==================== (一)功能:  输出调试变量(类似于TRACE)

(二)特点:  1.自动适应参数的类型(char、char*、string、CString、HWND、POINT、RECT....)  2.自动适应输入参数的个数。(关闭了编译提醒 #pragma warning(disable: 4003) )  3.会在输出的变量值前面自动添加变量的名称,方便查看  4.程序自动创建Edit窗口用于输出转换后的字符串。  5.程序退出时会将输出字符串保存到工程目录下的DebugData.txt。方便查看  6.多种编译模式,比如可让DEBUG和Release版本都能输出调试变量或者两者都不输出  7.支持UNICODE,WIN32,Dll,MFC

(三)使用说明:  1.把trace.h复制到工程目录下(可以不添加到工程)。  2.在文件"stdafx.h"里(文件的下方)添加 #include "trace.h"。之后就可以使用trace()宏了。  3.所有输出的字符串会保存在工程目录下的"DebugData.txt"文件,以方便查看  4.我把所有代码都放在一个头文件里,虽然不合符规范,但这样使用起来很方便。  5.trace(x,y,z,w)宏原本有4个参数,当参数不如时,编译器会给出警告,    所以使用 #pragma warning(disable: 4003) 把这个编译警告给关掉了。

(四)可以使用的宏:  trace(X,Y,Z,W) //输出常用类型变量,如int、double、short、POINT、RECT、string      //且自动适应变量的个数(变量数为1-4个)  tracef()  //格式化字符串,类似sprintf  traceLastError()//输出系统错误代码,调用了GetLastError()  traceRel(X,Y)  //当X=true,输出"Y: successful" ; x=false,输出"Y: failed"  CEasyTrace::clear();   //清空窗口  

(五)关于trace宏使能设置:  1.默认情况下 NO_TRACE_WINDOW 和 TRACE_WINDOW都没定义,则    DEBUG版本会输出调试字符串,而Release版本不会  2.如果开头定义了#define NO_TRACE_WINDOW    DEBUG版本和Release版本都不会输出输出调试字符串  3.如果开头定义了#define TRACE_WINDOW    DEBUG版本和Release版本都会输出输出调试字符串  4.每次修改上面2个宏后需要全部重新编译才会生效

(六)调用示例:  void CDemoDlg::OnButton1()  {   int a=45; double b=67.45; double c=847.424;short d=324;   RECT rect;   ::GetWindowRect(m_hWnd,&rect);   HWND hWnd=::GetForegroundWindow();   POINT point;   GetCursorPos(&point);

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值