//----------------------------------------------------------------------------- // // File: ltdebug.h // Copyright (C) 1994-1997 Microsoft Corporation // All rights reserved. // // Debugging facilities for Espresso 2.x. Included are augmented TRACE // and ASSERT facilities. // //----------------------------------------------------------------------------- #ifndef MITUTIL_LtDebug_h_INCLUDED #define MITUTIL_LtDebug_h_INCLUDED #pragma once #if defined(_DEBUG) #define LTTRACE_ACTIVE #define LTASSERT_ACTIVE #define new DEBUG_NEW #define LTGetAllocNumber() LTGetAllocNumberImpl() // // Executes code only in a DEBUG build. // #define DEBUGONLY(x) x #define LTDebugBreak() LTBreak() #else // _DEBUG #define DEBUGONLY(x) #define LTDebugBreak() (void) 0 #define LTGetAllocNumber() 0 #endif // _DEBUG #if defined(LTASSERT_ACTIVE) || defined (ASSERT_ALWAYS) #ifdef ASSERT #undef ASSERT #endif #ifdef VERIFY #undef VERIFY #endif #define ASSERT LTASSERT #define VERIFY LTVERIFY #ifndef _DEBUG #pragma message("Warning: LTASSERT Active in non-debug build") #endif // // The multilevel assert macros ensure that the line numbers get expanded to // something like "115" instead of "line" or "__LINE__" // // This will evaluate the expression only once, UNLESS to ask it to 'Retry'. // Then it will re-evaluate the expression after the return from the debugger. // #define LTASSERTONLY(x) x #define LTASSERT(x) LTASSERT2(x, TEXT(__FILE__), __LINE__) #define LTASSERT2(exp, file, line) \ while (!(exp) && LTFailedAssert(TEXT(#exp), file, line)) (void) 0 #define LTVERIFY(x) LTASSERT(x) #else // defined(_DEBUG) || defined(ASSERT_ALWAYS) #define LTASSERTONLY(x) #define LTASSERT(x) (void) 0 #define LTVERIFY(x) x #endif // defined(_DEBUG) || defined(ASSERT_ALWAYS) #ifndef MIT_NO_DEBUG // // Name of the project // #ifndef LTTRACEPROJECT #define LTTRACEPROJECT "Borg" #endif // // Default value for the exe name if one was not supplied. // #ifndef LTTRACEEXE #define LTTRACEEXE MSLOC #endif // // Used to put quotes around the LTTRACEEXE macro. // #define __stringify2(x) #x #define __stringify(x) __stringify2(x) // // TODO - find a better place for this LTAPIENTRY void CopyToClipboard(const char *szMessage); struct LTModuleInfo { UINT uiPreferredLoadAddress; UINT uiActualLoadAddress; UINT uiModuleSize; char szName[MAX_PATH]; }; LTAPIENTRY void LTInitDebug(void); LTAPIENTRY void LTInstallIMallocTracking(); LTAPIENTRY void LTDumpIMallocs(void); LTAPIENTRY void LTTrackIMalloc(BOOL f); LTAPIENTRY void LTRevokeIMallocTracking(); LTAPIENTRY void LTShutdownDebug(void); LTAPIENTRY BOOL LTSetAssertSilent(BOOL); LTAPIENTRY BOOL LTFailedAssert(const TCHAR *, const TCHAR *, int); LTAPIENTRY void LTBreak(void); LTAPIENTRY LONG LTGetAllocNumberImpl(void); LTAPIENTRY void LTBreakOnAlloc(const char *szFilename, int nLineNum, long nAllocNum); LTAPIENTRY BOOL LTCheckBaseAddress(HMODULE); LTAPIENTRY BOOL LTCheckAllBaseAddresses(void); LTAPIENTRY void LTCheckPagesFor(HINSTANCE); LTAPIENTRY void LTCheckPagesForAll(void); LTAPIENTRY void LTDumpAllModules(void); LTAPIENTRY BOOL LTLocateModule(DWORD dwAddress, HMODULE *pInstance); LTAPIENTRY BOOL LTGetModuleInfo(HMODULE, LTModuleInfo *); LTAPIENTRY UINT LTGenStackTrace(TCHAR *szBuffer, UINT nBuffSize, UINT nSkip, UINT nTotal); LTAPIENTRY void LTSetBoringModules(const char *aszBoring[]); LTAPIENTRY void LTTrackAllocations(BOOL); LTAPIENTRY void LTDumpAllocations(void); LTAPIENTRY BOOL LTCheckResourceRange(HINSTANCE, WORD UniqueStart, WORD UniqueEnd, WORD SharedStart, WORD SharedEnd); LTAPIENTRY BOOL LTCheckAllResRanges(WORD, WORD); #pragma warning(disable:4275) class LTAPIENTRY CAssertFailedException : public CException { public: CAssertFailedException(const TCHAR *); CAssertFailedException(const TCHAR *, BOOL); BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL); ~CAssertFailedException(); private: CAssertFailedException(); CAssertFailedException(const CAssertFailedException &); TCHAR *m_pszAssert; }; class LTAPIENTRY LTTracePoint { public: LTTracePoint(const TCHAR *); ~LTTracePoint(); private: LTTracePoint(); const TCHAR *m_psz; }; #pragma warning(default:4275) // // Comment this out to remove ASSERTs from retail builds // #define LTASSERT_ACTIVE #if defined(LTTRACE_ACTIVE) static const TCHAR *szLTTRACEEXE = TEXT(__stringify(LTTRACEEXE)); // // The following let us control the output dynamically. We use a function // pointer to route our debug output, and change the function pointer to // enable/disable tracing. // static void LTTRACEINIT(const TCHAR *, ...); static void (*LTTRACE)(const TCHAR *, ...) = LTTRACEINIT; void LTAPIENTRY LTTRACEOUT(const TCHAR *szFormat, va_list args); void LTAPIENTRY LTTRACEON(const TCHAR *szFormat, ...); void LTAPIENTRY LTTRACEOFF(const TCHAR *szFormat, ...); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // LTTRACE is initialized to point to this function. When first called, it // determines if tracing should be enabled, then routes LTTRACE through the // right handler. // //----------------------------------------------------------------------------- static void LTTRACEINIT( const TCHAR *szFormat, // printf style formatting string ...) // Variable argument list to format { BOOL fDoTrace = 1; va_list args; const TCHAR * const szTraceProfile = TEXT("lttrace.ini"); fDoTrace = GetPrivateProfileInt( TEXT("ProjectTracing"), TEXT("Default"), fDoTrace, szTraceProfile); fDoTrace = GetPrivateProfileInt( TEXT("ProjectTracing"), TEXT(LTTRACEPROJECT), fDoTrace, szTraceProfile); if (fDoTrace) { fDoTrace = GetPrivateProfileInt( TEXT("ExecutableTracing"), szLTTRACEEXE, fDoTrace, szTraceProfile); } if (fDoTrace) { LTTRACE = LTTRACEON; va_start(args, szFormat); LTTRACEOUT(szFormat, args); } else { LTTRACE = LTTRACEOFF; } } #define LTTRACEPOINT(sz) LTTracePoint lttp##__LINE__(TEXT(sz)) #else // defined(LTTRACE_ACTIVE) // // Retail version of the debugging macros. Everything // just 'goes away'. We use (void) 0 so that these things // are statements in both the debug and retail builds. // static inline void LTNOTRACE(const TCHAR *, ...) {} #define LTTRACE 1 ? (void) 0 : (void) LTNOTRACE #define LTTRACEPOINT(x) (void) 0 #endif // defined(LTTRACE_ACTIVE) #endif // MIT_NO_DEBUG #endif // #ifndef MITUTIL_LtDebug_h_INCLUDED