home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
mfc
/
src
/
dumpinit.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-16
|
4KB
|
157 lines
// 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
/////////////////////////////////////////////////////////////////////////////