当前位置: 主页 > 日志 > C/C++ >

加强版OutputDebugString

当一个大型程序中存在着一个非常隐蔽的错误(所谓隐蔽,指的是我从运行过程中发现程序不正常,但是即使检查源代码,也很难发现何处存在错误),于是乎,我们在运行过程中添加一些输出语句,把中间结果或者程序状态输出出来,根据大量的结果来推测程序究竟出错在何处。这种情况是绝非程序断点能够搞定的,因为有时候你断无可断(特别是对于DLL程序的调试)。由于我们输出的debug信息只能由Dbmon.exe(或Dbgview.exe)来显示,所以,即使程序发布之后,也无须去掉这些调试点,这样对以后排错也很有利。
     OutputDebugString是微软提供给我们用于输出调试信息的API函数,但是它只能直接输出的是字符串,而像GetLastError()返回数字型的的信息,需要经过类型转换(使用itoa将整型转换为字符数组)才能输出,比较麻烦。我们需要一种类似于printf函数的信息输出函数,它可以支持输出任何类型,任何个数的数据,例如:

  printf("地址: %p,字符串: %s,错误号:%d  ",p1,szStr,GetLastError());


   下面的一个自定义的调试信息输出函数(ODS),它实现了我们期望的功能,经过我在项目中的实际使用,发现效果很不错。

#include <stdarg.h>
#include <stdio.h>
#include <windows.h>

void ODS(const char * sz, ...)
{
    char szData[512]={0};

    va_list args;
    va_start(args, sz);
    _vsnprintf(szData, sizeof(szData- 1, sz, args);
    va_end(args);

    OutputDebugString(szData);
}


使用起来很简单,和printf函数调用格式基本一样,例如;

  ODS("地址: %p,字符串: %s,错误号:%d  ",p1,szStr,GetLastError());

   ODS函数非常适合用于调试像动态链接库程序(DLL)这样的不易设置断点的程序。我在开发ISAPI 程序时大量使用了该函数进行调试。
   DbgView.exe的下载地址:

  File: Click to Download

[日志信息]

该日志于 2009-03-05 11:41 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “加强版OutputDebugString” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部