debug.cpp

来自「深入浅出MFC 的书中源码 我也是找了很久才找到」· C++ 代码 · 共 81 行

CPP
81
字号
#include "stdafx.h"



#ifdef _PSEUDO_DEBUG   // entire file



#ifdef _PSEUDO_DEBUG

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif



LONG AssertBusy = -1;

LONG AssertReallyBusy = -1;



BOOL AssertFailedLine(LPCSTR lpszFileName, int nLine)

{

	TCHAR szMessage[_MAX_PATH*2];



	InterlockedDecrement(&AssertReallyBusy);



	// format message into buffer

	wsprintf(szMessage, _T("File %hs, Line %d"),

		lpszFileName, nLine);



	TCHAR szT[_MAX_PATH*2 + 20];

	wsprintf(szT, _T("Assertion Failed: %s\n"), szMessage);

	OutputDebugString(szT);



	if (InterlockedIncrement(&AssertBusy) > 0)

	{

		InterlockedDecrement(&AssertBusy);



		// assert within assert (examine call stack to determine first one)

		DebugBreak();

		return FALSE;

	}



	// active popup window for the current thread

	HWND hWndParent = GetActiveWindow();

	if (hWndParent != NULL)

		hWndParent = GetLastActivePopup(hWndParent);



	// display the assert

	int nCode = ::MessageBox(hWndParent, szMessage, _T("Assertion Failed!"),

		MB_TASKMODAL|MB_ICONHAND|MB_ABORTRETRYIGNORE|MB_SETFOREGROUND);



	// cleanup

	InterlockedDecrement(&AssertBusy);



	if (nCode == IDIGNORE)

		return FALSE;   // ignore



	if (nCode == IDRETRY)

		return TRUE;    // will cause DebugBreak



	AfxAbort();     // should not return (but otherwise DebugBreak)

	return TRUE;

}



void Trace(LPCTSTR lpszFormat, ...)

{

	va_list args;

	va_start(args, lpszFormat);



	int nBuf;

	TCHAR szBuffer[512];



	nBuf = _vstprintf(szBuffer, lpszFormat, args);

	ASSERT(nBuf < (sizeof(szBuffer)/sizeof(szBuffer[0])));



	CString strMessage;



	if (AfxGetApp() != NULL)

		strMessage = ((CString) (AfxGetApp()->m_pszExeName)) + _T(": ");

	strMessage += szBuffer;

	OutputDebugString(strMessage);



	va_end(args);

}





#endif // _PSEUDO_DEBUG

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?