给Win32 GUI程序调试信息输出方法
- 博客分类:
- 技术杂绘
给Win32 GUI程序调试信息输出方法
2011年09月23日
DebugView可以追踪TRACE(实际上是Windows函数OutputDebugString)的一个工具.
======================================================================
在Win32的GUI程序中,没有控制台窗口,我们输出调试信息时有些不方便,以往我的做法是使用MessageBox弹出对话框、OutputDebugString向VS的调试窗口输出信息等,但总感觉不如控制台输出几句printf有效率。经过尝试发现GUI程序照样能够拥有(且仅能够拥有一个)控制台窗口,具体做法如下:
#include
在程序初始化时,加入以下代码:
FILE* fpDebugOut = NULL;
FILE* fpDebugIn = NULL;
if( !AllocConsole() ) MessageBox(NULL, _T("控制台生成失败。"), NULL, 0);
SetConsoleTitle(_T("Debug Window"));
_tfreopen_s(&fpDebugOut, _T("CONOUT$"),_T("w"), stdout);
_tfreopen_s(&fpDebugIn, _T("CONIN$"), _T("r"), stdin);
_tsetlocale(LC_ALL, _T("chs")); //这是必要的,否则unicode模式下使用C库函数控制台输出不了中文 WriteConsole函数不受影响
注意AllocConsole可能失败,原因可能是程序已经于一个控制台窗口关联过了,等等。
程序结束时,加入以下代码:
fclose(fpDebugOut);
fclose(fpDebugIn);
FreeConsole();
好,现在已经加入了控制台,可以输出字符串了,使用标准的C库函数或者WriteConsole都可以:
使用WriteConsole的话前面其实不用调用freopen重定向输出流了,直接WriteConsole就行:
TCHAR str[256];
DWORD numOfCharWritten = 0;
_stprintf_s(str, 256, _T("今年是 %d 年\n"), 2008);
WriteConsole( GetStdHandle(STD_OUTPUT_HANDLE), str, _tcslen(str), &numOfCharWritten, NULL);
使用C库函数则更简单,但上面一定要调用freopen才有效:
int tmp = 0;
_tscanf_s(_T("%d\n"), &tmp);
_tprintf_s(_T("刚才输入的是 %d\n"), tmp);
比如在响应WM_PAINT消息时,加入_tprintf_s(_T("重绘 %d 次\n"), ++count),则每次窗口绘制的时候都将输出总重绘次数。
最后,定义两个宏图省事:
#define CREATE_DEBUG_CONSOLE \
FILE* fpDebugOut = NULL; \
FILE* fpDebugIn = NULL; \
FILE* fpDebugErr = NULL; \
if( !AllocConsole() ) \
MessageBox(NULL, _T("控制台生成失败。"), NULL, 0); \
SetConsoleTitle(_T("Debug Window")); \
_tfreopen_s(&fpDebugOut, _T("CONOUT$"),_T("w"), stdout); \
_tfreopen_s(&fpDebugIn, _T("CONIN$"), _T("r"), stdin); \
_tfreopen_s(&fpDebugErr, _T("CONOUT$"),_T("w"), stderr); \
_tsetlocale(LC_ALL, _T("chs"));
#define RELEASE_DEBUG_CONSOLE \
fclose(fpDebugOut); \
fclose(fpDebugIn); \
fclose(fpDebugErr); \
FreeConsole();
发表评论
-
道周中学2012年高三地理寒假作业答案
2012-01-20 11:42 567道周中学2012年高三地理 ... -
化学计算题的几种常见解法
2012-01-20 11:42 549化学计算题的几种常见解法 2012年01月15日 一、差 ... -
Windows编程类书籍介绍(转)
2012-01-20 11:42 456Windows编程类书籍介绍(转) 2012年01月08日 ... -
ls命令选项详解
2012-01-20 11:42 724ls命令选项详解 2012年01月19日 http:// ... -
js中export的问题-真爱无悔-博客园
2012-01-19 16:32 704js中export的问题-真爱无悔-博客园 2011年03月 ... -
AS3各种判断陷阱......以及处理方法
2012-01-19 16:32 540AS3各种判断陷阱......以 ... -
JavaScript的例外处理(try...catch...finally)
2012-01-19 16:32 596JavaScript的例外处理(try...catch...f ... -
转载 js中的基本常识 收藏
2012-01-19 16:32 536转载 js中的基本常识 收 ... -
JavaScript--JavaScript对象
2012-01-19 16:32 526JavaScript--JavaScript对象 2 ... -
EGLIBC库介绍
2012-01-17 06:17 546EGLIBC库介绍 2011年05月05 ... -
SAMSUNG S3C2440的简易BootLoader ㈢
2012-01-17 06:17 593SAMSUNG S3C2440的简易BootLoa ... -
meego开发的学习路线
2012-01-17 06:17 462meego开发的学习路线 2011年06月26日 不同版 ... -
GCC调试基础知识
2012-01-17 06:17 488GCC调试基础知识 2011年08月19日 1984年, ... -
神马都是浮云
2012-01-16 04:57 524神马都是浮云 2012年01月14日 今天给litt ... -
神马都是浮云。、
2012-01-16 04:57 559神马都是浮云。、 2011年12月12日 1、上课时,老 ... -
补考重修都是浮云!
2012-01-16 04:57 651补考重修都是浮云! 2012 ... -
神马=浮云?
2012-01-16 04:57 587神马=浮云? 2011年12月30日 我用一生的时间,在 ...
相关推荐
MFC调用win32窗口显示调试信息,使用AllocConsole 函数(2010-11-16 15:33:25)转载标签: 调试win32mfc杂谈 分类: 编译器 AllocConsole Function 为主调进程分配一个新的控制台。 语法 C++ : BOOL WINAPI ...
第3章 Win32 调试API 3.1 Win32调试API原理 3.2 利用调试API编写脱壳机 3.3 利用调试API制作内存补丁 第4章 Windows下的异常处理 4.1 基本概念 4.2 结构化异常处理(SEH) 4.3 异常处理程序设计 4.4 SEH的简单应用 ...
第3章 Win32 调试API3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个...
第3章 Win32 调试API 3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 ...
第3章 Win32 调试API 3.1 Win32调试API原理 3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 ...
Sloth是一个Mac应用程序,它显示系统上所有正在运行的进程正在使用的所有打开的文件和套接字。这使得检查哪些应用程序正在使用哪些文件和套接字变得容易。 特征 查看所有打开的文件,目录,IP套接字,设备,Unix域...
虽然该项目的重点是 Linux,但它在可使用 GNU 开发者工具的所有环境(包括 Win32(Win 95/98/Me/NT/2000/XP)、QNX Neutrino 和 Solaris 平台)中都能工作。 CDT 是完全用 Java 实现的开放源码项目(根据 Common ...
使用 NEAT 工程向导建立应用程序 ........................................................................................................ 5 编译及运行程序(模拟器下) ......................................
<br/>第3章 Win32 调试API <br/>3.1 Win32调试API原理 <br/> 3.1.1 调试相关函数简要说明 <br/> 3.1.2 调试事件 <br/> 3.1.3 如何在调试时创建并跟踪一个进程 <br/> 3.1.4 最主要的循环体...
12-2 Win32选项卡中的常用组件 12-2-1 TPageControl组件 12-2-2 TImageList组件 12-2-3 TRichEdit组件 12-2-4 TDateTimePicker组件 12-2-5 TStatusBar组件 12-3 System选项卡中的常用组件 12-3-1 TTimer组件 ...
Lcc_win32 MASM32 v9.0 Radasm ollydbg 1.10 winHex 12.5 包含文档: 1. multiCCL_f.exe 文件特征码专用版 2. multiCCL_m.exe 内存特征码专用版 3. multiCCL_inj.exe 注入代码块内存定位专用版 4. memtest....
Lcc_win32 MASM32 v9.0 Radasm ollydbg 1.10 winHex 12.5 包含文档: 1. multiCCL_f.exe 文件特征码专用版 2. multiCCL_m.exe 内存特征码专用版 3. multiCCL_inj.exe 注入代码块内存定位专用版 4. memtest....
Python 基础教程 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Perl语言一样, Python 源代码同样遵循 GPL(GNU ...
<br>12-1 Additional选项卡中的常用组件 12-1-1 TBitBtn组件 12-1-2 TMaskEdit组件 12-1-3 TImage组件 12-1-4 TShape组件 12-2 Win32选项卡中的常用组件 12-2-1 TPageControl组件 ...
最后需要说的是笔者的调试上面程序的环境:WIN2000 , JDK1.3,MS SQLSERVER编辑软件:EDITPLUS 2.01a(这最后的东西可不是废话,虽然早就了一些专业的JAVA开发工具,但是笔者建议JAVA初学者使用文本软件开发JAVA程序...