Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

80 lines
1.7 KiB

#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