很久没有写下什么东西了, 现在继续来写这个调试打印信息的函数吧!或许是自己一直使用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__ */