DebugPrint - 1.0.0.3
来源:互联网 发布:09年加索尔总决赛数据 编辑:程序博客网 时间:2024/06/08 04:16
很久没有写下什么东西了, 现在继续来写这个调试打印信息的函数吧!或许是自己一直使用C语言和汇编的缘故吧, 对于C++自己可是一直都未曾入门呢?
这个打印的调试信息也是根据某同事的作品经过自己的修改而最终形成的。在实现打印调试功能时, 我先定义了一个打印调试信息的接口:
WINDBGAPI
DbgPrintA(
__in const CHAR* szFormat,
__in ...
);
这个接口便是供程序调用的, 以便实时追踪程序当前的运行状况。
然后定义了一个宏, 控制这个接口在Debug版本才起着打印调试信息的作用, 而在发布的Release版本则不需要打印那令人头疼的庞大调试信息。
#ifdef _DEBUG
#define DbgPrint DbgPrintA
#else
#define DbgPrint (void)0
#endif /* _DEBUG */
接着我定义了一个类来具体实现打印信息的解析和具体的打印到具体指定的调试文件:
class CDebug {
CRITICAL_SECTION m_cs;
public:
CDebug(
__in const CHAR* szFormat,
__in va_list argList
);
virtual ~CDebug();
protected:
BOOL Debug(
__in const CHAR* szFormat,
__in va_list argList
);
BOOL DebugInternal(
__in const CHAR* szFormat,
__in va_list argList,
__in const int nLength
);
BOOL DebugPrint(
__in const CHAR* szDebug
);
};
这样在DbgPrintA函数接口里面构造一个CDebug的对象, CDebug->Debug->DebugInternal->DebugPrint这样就最终打印出了具体的调试信息了。
当然对于C++, 我只不过是一个初学者, 希望高手见到我的code不要见笑, 能够不吝赐教, 谢谢, 下面便是整个实现的源代码(这里为了节约空间, 去掉了程序的注释, 请谅解)!
/* source code ---- debug.h */
#ifndef __DEBUG_LOG_INFORMATION_H__
#define __DEBUG_LOG_INFORMATION_H__
#include <windows.h>
#include <stdio.h>
#pragma warning(disable:4353)
#if !defined(_WINDBG_LOG_)
#define WINDBGAPI extern void WINAPI
#else
#define WINDBGAPI
#endif /* _WINDBG_LOG_ */
#ifndef WINDBG_NO_DEBUG_INTERFACE
WINDBGAPI
DbgPrintA(
__in const CHAR* szFormat,
__in ...
);
#ifdef _DEBUG
#define DbgPrint DbgPrintA
#else
#define DbgPrint (void)0
#endif /* _DEBUG */
#endif /* WINDBG_NO_DEBUG_INTERFACE */
class CDebug {
CRITICAL_SECTION m_cs;
public:
CDebug(
__in const CHAR* szFormat,
__in va_list argList
);
virtual ~CDebug();
protected:
BOOL Debug(
__in const CHAR* szFormat,
__in va_list argList
);
BOOL DebugInternal(
__in const CHAR* szFormat,
__in va_list argList,
__in const int nLength
);
BOOL DebugPrint(
__in const CHAR* szDebug
);
};
__inline
CDebug::CDebug(
__in const CHAR* szFormat,
__in va_list argList
)
{
InitializeCriticalSection(&m_cs);
Debug(szFormat, argList);
}
__inline
CDebug::~CDebug()
{
DeleteCriticalSection(&m_cs);
}
__inline
BOOL CDebug::Debug(
__in const CHAR* szFormat,
__in va_list argList
)
{
int len = 0;
BOOL bRet = FALSE;
if (NULL == szFormat || NULL == argList)
return FALSE;
EnterCriticalSection(&m_cs);
len = _vscprintf(szFormat, argList) + 1;
bRet = DebugInternal(szFormat, argList, len);
LeaveCriticalSection(&m_cs);
return bRet;
}
__inline
BOOL CDebug::DebugInternal(
__in const CHAR* szFormat,
__in va_list argList,
__in const int nLength
)
{
CHAR* pDebug = NULL;
BOOL bRet = FALSE;
int size = sizeof(CHAR) * nLength;
if (NULL == szFormat || NULL == argList)
return FALSE;
pDebug = (CHAR*)HeapAlloc(GetProcessHeap(), 0, size);
if (NULL == pDebug) return FALSE;
memset(pDebug, 0, size);
_vsnprintf_s(pDebug, nLength, nLength, szFormat, argList);
bRet = DebugPrint(pDebug);
if (NULL != pDebug) {
HeapFree(GetProcessHeap(), 0, pDebug);
pDebug = NULL;
}
return bRet;
}
__inline
BOOL CDebug::DebugPrint(
__in const CHAR* szDebug
)
{
FILE* pFile = NULL;
SYSTEMTIME st;
if (NULL == szDebug) return FALSE;
fopen_s(&pFile, "debug.log", "a+");
if (NULL == pFile) return FALSE;
GetLocalTime(&st);
fprintf_s(pFile, "[%.2d:%.2d:%.2d:%.3d] %s/n",
st.wHour, st.wMinute, st.wSecond,
st.wMilliseconds, szDebug);
if (NULL != pFile) {
fclose(pFile);
pFile = NULL;
}
return TRUE;
}
__inline
WINDBGAPI DbgPrintA(
__in const CHAR* szFormat,
__in ...
)
{
va_list argList = NULL;
va_start(argList, szFormat);
CDebug dbg(szFormat, argList);
va_end(argList);
}
#endif /* __DEBUG_LOG_INFORMATION_H__ */
- DebugPrint - 1.0.0.3
- DebugPrint-1.0.0.2
- DebugPrint
- DebugPrint
- debugPrint-1.1
- debugPrint-1.2
- debugPrint-1.3
- debugPrint-1.4
- DebugPrint 格式说明符
- DebugPrint和字符串转换
- DebugPrint格式输出
- 为什么1.0 - 0.7 != 0.3?????
- RapidCheck 0.3 + Rapidshare Free Account Notifier 1.0
- hadoop 1.0.0.3安装与配置,绝对实用
- AIX6.1.0.7安装11.2.0.3报错的处理
- .0.3
- 0.3+0.3+0.3=?
- RSS 各个标准差异 (RSS 0.9x/2.0,RSS 1.0,Atom 0.3)
- Python学习笔记
- SaaS的定义
- SOA的定义
- 电脑高手最常用的5个按钮
- 电脑高手最常用的5个按钮
- DebugPrint - 1.0.0.3
- 转载
- 第5讲 全程软件测试-测试自动化
- 游戏设计
- 读风中叶的《我的漫漫程序人生路》笔记
- 什么是强类型语言和弱类型语言
- 雨落秋界
- 关于大学,关于未来(一个迷茫的大专生的心里话)
- 理解0.11内核setup.s中实模式与保护模式的切换