📄 spdebug.h
字号:
int reportMode = _CrtSetReportMode(m_reportType, m_reportModePrev);
if (reportMode & _CRTDBG_MODE_FILE)
{
CloseHandle((_HFILE)_CrtSetReportFile(m_reportType, (_HFILE)m_hfilePrev));
}
ReleaseMutex(m_mutex);
return TRUE;
}
private:
HANDLE m_mutex;
int m_reportType;
int m_reportModePrev;
_HFILE m_hfilePrev;
BOOL m_fAssertSettingsReReadEachTime;
DWORD m_FuncTraceMode;
TCHAR m_szFuncTraceFile[MAX_PATH + 1];
DWORD m_ParamInfoMode;
TCHAR m_szParamInfoFile[MAX_PATH + 1];
DWORD m_DumpInfoMode;
TCHAR m_szDumpInfoFile[MAX_PATH + 1];
DWORD m_AssertMode;
TCHAR m_szAssertFile[MAX_PATH + 1];
DWORD m_HRFailMode;
TCHAR m_szHRFailFile[MAX_PATH + 1];
BOOL m_fDebugServerOnStart;
BOOL m_fDebugClientOnStart;
};
inline CSpDebug *PSpDebug()
{
static CSpDebug debug;
return &debug;
}
class CSpFuncTrace
{
public:
CSpFuncTrace(PCHAR pFuncName)
{
m_pFuncName = pFuncName;
if (PSpDebug()->FuncTrace())
{
_RPT1( _CRT_WARN, "\nEntering Function: %s\n", m_pFuncName );
PSpDebug()->FuncTrace(FALSE);
}
}
~CSpFuncTrace()
{
if (PSpDebug()->FuncTrace())
{
_RPT1( _CRT_WARN, "Leaving Function: %s\n", m_pFuncName );
PSpDebug()->FuncTrace(FALSE);
}
}
private:
PCHAR m_pFuncName;
};
#endif // _DEBUG
//=== User macros ==============================================================
#ifdef _DEBUG
#define SPDBG_FUNC(name) \
CSpFuncTrace functrace(name)
#if defined(ASSERT_WITH_STACK) && !defined(_WIN64)
#define SPDBG_REPORT_ON_FAIL(hr) \
do \
{ \
HRESULT _hr = (hr); \
if (FAILED(_hr) && PSpDebug()->HRFail()) \
{ \
SYSTEMTIME sysTime; \
GetLocalTime(&sysTime); \
CHAR pszHrWithTime[100]; \
sprintf(pszHrWithTime, "%lX\n\n%d.%d.%d %02d:%02d:%02d", \
_hr, \
sysTime.wMonth,sysTime.wDay,sysTime.wYear, \
sysTime.wHour,sysTime.wMinute,sysTime.wSecond); \
PCHAR pszStack = \
(PCHAR)_alloca( \
cchMaxAssertStackLevelStringLen * \
cfrMaxAssertStackLevels + 1); \
GetStringFromStackLevels(0, 10, pszStack); \
_RPT4(_CRT_WARN, \
"%s(%d): Failed HR = %s\n\n%s\n", \
__FILE__, \
__LINE__, \
pszHrWithTime, \
pszStack); \
PSpDebug()->HRFail(FALSE); \
} \
} while (0)
#else // ASSERT_WITH_STACK & !_WIN64
#define SPDBG_REPORT_ON_FAIL(hr) \
do \
{ \
HRESULT _hr = (hr); \
if (FAILED(_hr) && PSpDebug()->HRFail()) \
{ \
_RPT3(_CRT_WARN, "%s(%d): Failed HR = %lX\n", __FILE__, __LINE__, (_hr) );\
PSpDebug()->HRFail(FALSE); \
} \
} while (0)
#endif // ASSERT_WITH_STACK
#define SPDBG_ASSERT(expr) \
do \
{ \
if (!(expr)) \
{ \
if (PSpDebug()->Assert()) \
{ \
_ASSERTE( expr ); \
PSpDebug()->Assert(FALSE); \
} \
} \
} \
while (0)
#define SPDBG_VERIFY(expr) \
SPDBG_ASSERT(expr)
#define SPDBG_PMSG0(format) \
do \
{ \
if (PSpDebug()->ParamInfo()) \
{ \
_RPT0(_CRT_WARN, format); \
PSpDebug()->ParamInfo(FALSE); \
} \
} while (0)
#define SPDBG_PMSG1(format, arg1) \
do \
{ \
if (PSpDebug()->ParamInfo()) \
{ \
_RPT1(_CRT_WARN, format, arg1); \
PSpDebug()->ParamInfo(FALSE); \
} \
} while (0)
#define SPDBG_PMSG2(format, arg1, arg2) \
do \
{ \
if (PSpDebug()->ParamInfo()) \
{ \
_RPT2(_CRT_WARN, format, arg1, arg2); \
PSpDebug()->ParamInfo(FALSE); \
} \
} while (0)
#define SPDBG_PMSG3(format, arg1, arg2, arg3) \
do \
{ \
if (PSpDebug()->ParamInfo()) \
{ \
_RPT3(_CRT_WARN, format, arg1, arg2, arg3); \
PSpDebug()->ParamInfo(FALSE); \
} \
} while (0)
#define SPDBG_PMSG4(format, arg1, arg2, arg3, arg4) \
do \
{ \
if (PSpDebug()->ParamInfo()) \
{ \
_RPT4(_CRT_WARN, format, arg1, arg2, arg3, arg4); \
PSpDebug()->ParamInfo(FALSE); \
} \
} while (0)
#define SPDBG_DMSG0(format) \
do \
{ \
if (PSpDebug()->DumpInfo()) \
{ \
_RPT0(_CRT_WARN, format); \
PSpDebug()->DumpInfo(FALSE); \
} \
} while (0)
#define SPDBG_DMSG1(format, arg1) \
do \
{ \
if (PSpDebug()->DumpInfo()) \
{ \
_RPT1(_CRT_WARN, format, arg1); \
PSpDebug()->DumpInfo(FALSE); \
} \
} while (0)
#define SPDBG_DMSG2(format, arg1, arg2) \
do \
{ \
if (PSpDebug()->DumpInfo()) \
{ \
_RPT2(_CRT_WARN, format, arg1, arg2); \
PSpDebug()->DumpInfo(FALSE); \
} \
} while (0)
#define SPDBG_DMSG3(format, arg1, arg2, arg3) \
do \
{ \
if (PSpDebug()->DumpInfo()) \
{ \
_RPT3(_CRT_WARN, format, arg1, arg2, arg3); \
PSpDebug()->DumpInfo(FALSE); \
} \
} while (0)
#define SPDBG_DMSG4(format, arg1, arg2, arg3, arg4) \
do \
{ \
if (PSpDebug()->DumpInfo()) \
{ \
_RPT4(_CRT_WARN, format, arg1, arg2, arg3, arg4); \
PSpDebug()->DumpInfo(FALSE); \
} \
} while (0)
#define SPDBG_RETURN(hr) \
{ \
HRESULT __hr = (hr); \
if (FAILED(__hr)) \
{ \
SPDBG_REPORT_ON_FAIL(__hr); \
} \
return __hr; \
}
#define SPDBG_DEBUG_SERVER_ON_START() \
{ \
if (PSpDebug()->DebugServerOnStart()) \
{ \
if (MessageBox( \
GetDesktopWindow(), \
_T("Attach Debugger to the SAPI Server process?"), \
_T("SAPI"), \
MB_YESNO) == IDYES) \
{ \
USES_CONVERSION; \
TCHAR szCommand[MAX_PATH + 1]; \
wsprintf( \
szCommand, \
_T("msdev -p %d"), \
GetCurrentProcessId()); \
system(T2A(szCommand)); \
} \
} \
}
#define SPDBG_DEBUG_CLIENT_ON_START() \
{ \
if (PSpDebug()->DebugClientOnStart()) \
{ \
TCHAR szModule[MAX_PATH + 1]; \
szModule[0] = '\0'; \
TCHAR * pszSapiServer = \
_T("sapisvr.exe"); \
GetModuleFileName( \
NULL, \
szModule, \
MAX_PATH); \
if ((_tcslen(szModule) <= \
_tcslen(pszSapiServer) || \
_tcsicmp( \
szModule + \
_tcslen(szModule) - \
_tcslen(pszSapiServer), \
pszSapiServer) != 0) && \
MessageBox( \
GetDesktopWindow(), \
_T("Attach Debugger to the SAPI Client process?"), \
_T("SAPI"), \
MB_YESNO) == IDYES) \
{ \
USES_CONVERSION; \
TCHAR szCommand[MAX_PATH + 1]; \
wsprintf( \
szCommand, \
_T("msdev -p %d"), \
GetCurrentProcessId()); \
system(T2A(szCommand)); \
} \
} \
}
#else // _DEBUG
#define SPDBG_FUNC(name)
#define SPDBG_REPORT_ON_FAIL(hr)
#define SPDBG_ASSERT(expr)
#define SPDBG_VERIFY(expr) (expr)
#define SPDBG_PMSG0(format)
#define SPDBG_PMSG1(format, arg1)
#define SPDBG_PMSG2(format, arg1, arg2)
#define SPDBG_PMSG3(format, arg1, arg2, arg3)
#define SPDBG_PMSG4(format, arg1, arg2, arg3, arg4)
#define SPDBG_DMSG0(format)
#define SPDBG_DMSG1(format, arg1)
#define SPDBG_DMSG2(format, arg1, arg2)
#define SPDBG_DMSG3(format, arg1, arg2, arg3)
#define SPDBG_DMSG4(format, arg1, arg2, arg3, arg4)
#define SPDBG_RETURN(hr) return (hr)
#define SPDBG_DEBUG_SERVER_ON_START()
#define SPDBG_DEBUG_CLIENT_ON_START()
#endif // _DEBUG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -