怎样在代码中使用Debug的调试?另外附带完整的使用流程------OutputDebugString函数


本文分4部分 第1部分:为什么使用Debug调试? 第2部分:怎样使用? 第3部分:怎样查看debug情况? 第4部分:转载资料补充介绍
-----------------------------第1部分:为什么使用Debug调试?-----------------------------
1个程序分Debug与Release版本.但实际工作中,这2版本是集成在一起的,即你的程序是与别的项目上下相连接的,你以前单独写

的模块,是只顾自己写的,现在是顾上顾下,代码只有一份,要在切换Debug时,自动响应Debug处理
解决办法:统一命名调试模式,在需要调试的地方使用条件编译.
先参考一下微软作法:新建一个MFC程序即可看到

#ifdef _DEBUG
 #define new DEBUG_NEW
 #endif

-----------------------------第2部分:怎样使用?-----------------------------
测试第1步:
win32控制台应用程序---无MFC,不能识别::OutputDebugString函数,需包含#include "windows.h"
win32控制台应用程序---有MFC,可以正常识别::OutputDebugString函数
源代码如下:

int _tmain(int argc, _TCHAR* argv[])
 {
 cout<<"1111"<<endl;
 #ifdef _DEBUG
 ::OutputDebugString(" 检测调试模式 启动1... \n");
 cout<<"检测调试模式 启动1---cout输出... \n";
 #endif // _DEBUG
 cout<<"2222"<<endl;
 system("pause");
 return 0;
 }


测试结果:
注意点1:要使用调试内的信息,必须要切换到Debug模式,否则不运行
注意点2:在无MFC支持的程序中,包含头文件#include "windows.h"即可(不需要额外的库支持,已测试过)

-----------------------------第3部分:怎样查看debug情况?-----------------------------

使用微软DebugView,效果图如下

怎样在代码中使用Debug的调试?另外附带完整的使用流程------OutputDebugString函数_#ifdef


DebugView微软下载网址:http://technet.microsoft.com/zh-cn/sysinternals/bb896647(en-us).aspx

-----------------------------第4部分:转载资料补充介绍-----------------------------

Warning: Invalid argument supplied for foreach() in /home/dohkoos4/public_html/wp-content/plugins/where-did-they-go-from-here/where-did-they-go-from-here.php on line 54

方法一:使用OutputDebugString函数
函数的原型如下:

void OutputDebugString(
     LPCTSTR lpOutputString
 );

该函数会输出信息到系统的DEBUGER,输出结果可以使用工具DebugView观察。因为OutputDebugString的参数是字符串,而我们在实际使用过程中通常希望能像printf一样支持变参。下面的方法实现了这个效果:

void DebugString(LPCTSTR lpszFormat, ...)
 {
     va_list args;
     TCHAR szText[1024];     va_start(args, lpszFormat);
     wvsprintf(szText, lpszFormat, args);
     OutputDebugString(szText);
     va_end(args);
 }

方法二:输出调试信息到Console上

FILE *stream;
 AllocConsole();
 freopen_s(&stream, "CONOUT$", "w", stdout);
 printf("hello, world.\n");

这里AllocConsole()用来打开Console,而freopen_s则把标准输出和Cosole关联。"CONOUT$"这个很关键。

使用OutputDebugString调试窗口程序 
学编程是从DOS下开始的,用了一定时间的TC2.0,使得养成了用printf输出变量值进行调试的坏习惯。到了写窗口程序时,就遇到了些麻烦。 
窗口程序没有方便的进行控制台输出的方法(其实是我不知道),于是,用了几年的用MessageBox进行输出的调试手段,太麻烦了,因为MessageBox会打断程序流程,还要人为手动让它继续运行,这是最让人恼火的。 
后来用上了VC.NET2003,发现有OutputDebugString这个调试API,在IDE下调试,则会把它的输出定向到IDE中的Debugger上。

附注1:条件编译,就是封装类头文件那个所谓的预编译宏,加载一次,以后就不在理它了,此处的Debug预编译宏原理是与它一样,
那Debug与Release是怎样识别你那所谓的预编译宏,在哪个环境用,哪个环境不能用?这些操作微软其实已给我们做好了

如#ifdef _DEBUG
 //*************
 #endif // _DEBUG
 这个_DEBUG宏


附注2:程序中的调试宏,用途其实是很大的,特别是完成端口这种大规模的网络程序,因为窗口刷新你根本看不清,而DebugView

就能过滤出Debug,另外在MFC应用程序中,也是看不到printf与cout的调试信息(用MessageBox最差了),而DebugView却能看到.等等

附注3:另外这个是写驱动程序必备的了,比如你写了一个驱动的Hello World!,就可以用它来看出来,也就是说也包含了驱动的Debug查看

附注4:DebugView另外提供了保存成.txt文本,也提供了查询指定PID


#vc常用错误