// This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #ifdef _DEBUG // entire file #ifdef AFX_AUX_SEG #pragma code_seg(AFX_AUX_SEG) #endif // You must have AFX.INI (from \MSVC20\MFC\SRC) in your Windows // directory if you desire diagnostic output. // See Technical note TN007 for a description of // afxTraceFlags and afxTraceEnabled. AFX_DATADEF CDumpContext afxDump; AFX_DATADEF BOOL afxTraceEnabled; AFX_DATADEF UINT afxTraceFlags; BOOL _afxDiagnosticInit = AfxDiagnosticInit(); ///////////////////////////////////////////////////////////////////////////// // _AFX_DEBUG_STATE implementation static const TCHAR szIniFile[] = _T("AFX.INI"); static const TCHAR szDiagSection[] = _T("Diagnostics"); static const TCHAR szTraceEnabled[] = _T("TraceEnabled"); static const TCHAR szTraceFlags[] = _T("TraceFlags"); #ifndef _AFX_NO_DEBUG_CRT static _CRT_DUMP_CLIENT pfnOldCrtDumpClient = NULL; static _CRT_REPORT_HOOK pfnOldCrtReportHook = NULL; void __cdecl _AfxCrtDumpClient(void * pvData, unsigned int nBytes) { char sz[256]; CObject* pObject = (CObject*)pvData; #ifndef _AFX_PORTABLE // use SEH (structured exception handling) to catch even GPFs // that result from partially valid objects. __try #endif { // with vtable, verify that object and vtable are valid if (!AfxIsValidAddress(*(void**)pObject, sizeof(void*), FALSE) || !AfxIsValidAddress(pObject, pObject->GetRuntimeClass()->m_nObjectSize, FALSE)) { // short form for invalid objects wsprintfA(sz, "an invalid object at $%08lX, %u bytes long\n", pvData, nBytes); afxDump << sz; } else if (afxDump.GetDepth() > 0) { // long form pObject->Dump(afxDump); afxDump << "\n"; } else { // short form wsprintfA(sz, "a %hs object at $%08lX, %u bytes long\n", pObject->GetRuntimeClass()->m_lpszClassName, pvData, nBytes); afxDump << sz; } } #ifndef _AFX_PORTABLE __except(EXCEPTION_EXECUTE_HANDLER) { // short form for trashed objects wsprintfA(sz, "faulted while dumping object at $%08lX, %u bytes long\n", pvData, nBytes); afxDump << sz; } #endif if (pfnOldCrtDumpClient != NULL) (*pfnOldCrtDumpClient)(pvData, nBytes); return; } int __cdecl _AfxCrtReportHook(int nRptType, char *szMsg, int* pResult) { // call the old report hook if there was one if (pfnOldCrtReportHook != NULL && (*pfnOldCrtReportHook)(nRptType, szMsg, pResult)) { return TRUE; } // no hook on asserts or when m_pFile is NULL if (nRptType == _CRT_ASSERT || afxDump.m_pFile == NULL) return FALSE; // non-NULL m_pFile, so go through afxDump for the message *pResult = FALSE; afxDump << szMsg; return TRUE; } #endif // _AFX_NO_DEBUG_CRT _AFX_DEBUG_STATE::_AFX_DEBUG_STATE() { afxTraceEnabled = ::GetPrivateProfileInt(szDiagSection, szTraceEnabled, TRUE, szIniFile); afxTraceFlags = ::GetPrivateProfileInt(szDiagSection, szTraceFlags, 0, szIniFile); #ifndef _AFX_NO_DEBUG_CRT ASSERT(pfnOldCrtDumpClient == NULL); pfnOldCrtDumpClient = _CrtSetDumpClient(_AfxCrtDumpClient); ASSERT(pfnOldCrtReportHook == NULL); pfnOldCrtReportHook = _CrtSetReportHook(_AfxCrtReportHook); _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW); #endif // _AFX_NO_DEBUG_CRT } _AFX_DEBUG_STATE::~_AFX_DEBUG_STATE() { #ifndef _AFX_NO_DEBUG_CRT _CrtDumpMemoryLeaks(); int nOldState = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); _CrtSetDbgFlag(nOldState & ~_CRTDBG_LEAK_CHECK_DF); _CrtSetReportHook(pfnOldCrtReportHook); _CrtSetDumpClient(pfnOldCrtDumpClient); #endif // _AFX_NO_DEBUG_CRT } #pragma warning(disable: 4074) #pragma init_seg(lib) PROCESS_LOCAL(_AFX_DEBUG_STATE, afxDebugState) BOOL AFXAPI AfxDiagnosticInit(void) { // just get the debug state to cause initialization _AFX_DEBUG_STATE* pState = afxDebugState.GetData(); ASSERT(pState != NULL); return TRUE; } #endif //_DEBUG /////////////////////////////////////////////////////////////////////////////