怎样在代码中使用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,效果图如下
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常用错误