OutputDebugString, NKDbgPrintfW

如何调试Win32程序
方法一:使用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$"这个很关键。

WinCE BSP中打印信息的实现介绍 
不管在WinCE5.0还是在WinCE6.0中,我们在调试驱动或者应用的时候都会用到打印函数。在驱动里面,我们可能会用DEBUGMSG(..), RETAILMSG(..),还有NKDbgPrintfW(..)。在我们使用这些打印函数调试我们的程序之前,我们需要实现串口打印功能。
在WinCE的BSP中,如果想调用DEBUGMSG(..)或者RETAILMSG(..)来从串口打印信息,必须在我们的BSP中的OAL层找到debug.c,在这个文件里面实现下面的4个函数:
    void OEMInitDebugSerial(void) :           初始化用于打印信息的串口
    int OEMReadDebugByte (void):            从串口读一个byte,出错时返回OEM_DEBUG_COM_ERROR;没有数据时返回OEM_DEBUG_READ_NODATA
    void OEMWriteDebugByte(BYTE ch): 写一个byte到串口
    void OEMWriteDebugString(unsigned short* str): 写一个字符串到串口,这个函数其实就是通过调用OEMWriteDebugByte(..)实现的。
实现了上述的4个函数,就可以通过串口打印来调试程序了。一般这4个函数在OAL中的debug.c中实现。

在BSP中,我们一般会用3个函数来实现打印:DEBUGMSG,RETAILMSG,NKDbgPrintfW。简单介绍一下:
    NKDbgPrintfW(..)函数一般只在OAL中使用,可以直接从串口中打印出信息,不受编译选项的影响。
    DEBUGMSG(..)函数只有在工程在Debug模式下编译以后,才会打印出信息来。如果是在Release模式下编译的,就不会打印信息出来。
    RETAILMSG(..)函数在Debug模式下和Release模式下编译都会打印出调试信息,但是如果你在工程的属性中的"Build option"中选择了"Enable ship build",那么RETAILMSG函数就不会打印信息了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blueflyzl/archive/2008/03/07/2157016.aspx

posted on 2010-05-27 16:10  xilentz  阅读(2683)  评论(0编辑  收藏  举报