|
|
/*-----------------------------------------------------------------------------
debug.cpp
This file implements the debuggin features
Copyright (c) 1996-1998 Microsoft Corporation All rights reserved
Authors: ChrisK Chris Kauffman
Histroy: 7/22/96 ChrisK Cleaned and formatted 7/31/96 ValdonB Changes for Win16 -----------------------------------------------------------------------------*/
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#if defined(WIN16)
extern HINSTANCE g_hInst; extern LPSTR g_lpszCommandLine; extern LPSTR GetCommandLine(void); #endif
BOOL fInAssert=FALSE;
// ############################################################################
// DebugSz
//
// This function outputs debug string
//
// Created 1/28/96, Chris Kauffman
// ############################################################################
void DebugSz(LPCSTR psz) { #if defined(_DEBUG)
OutputDebugString(psz); #endif
} // DebugSz
// ############################################################################
// Debug Printf to debug output screen
void Dprintf(LPCSTR pcsz, ...) { #ifdef _DEBUG
va_list argp; char szBuf[1024]; va_start(argp, pcsz);
#if 0
vsprintf(szBuf, pcsz, argp); #else
wvsprintf(szBuf, pcsz, argp); #endif
DebugSz(szBuf); va_end(argp); #endif
} // Dprintf()
// ############################################################################
// Handle asserts
BOOL FAssertProc(LPCSTR szFile, DWORD dwLine, LPCSTR szMsg, DWORD dwFlags) {
BOOL fAssertIntoDebugger = FALSE;
char szMsgEx[1024], szTitle[255], szFileName[MAX_PATH]; int id; UINT fuStyle; LPTSTR pszCommandLine = GetCommandLine(); //BYTE szTime[80];
#if !defined(WIN16)
CHAR szTime[80]; HANDLE hAssertTxt; SYSTEMTIME st; DWORD cbWritten; #endif
// no recursive asserts
if (fInAssert) { DebugSz("***Recursive Assert***\r\n"); return(FALSE); }
fInAssert = TRUE; #if defined(WIN16)
GetModuleFileName(g_hInst, szFileName, MAX_PATH); wsprintf(szMsgEx,"%s:#%ld\r\n%s,\r\n%s", szFile, dwLine, szFileName, szMsg); #else
GetModuleFileName(NULL, szFileName, MAX_PATH); wsprintf(szMsgEx,"%s:#%d\r\nProcess ID: %d %s, Thread ID: %d\r\n%s", szFile,dwLine,GetCurrentProcessId(),szFileName,GetCurrentThreadId(),szMsg); #endif
wsprintf(szTitle,"Assertion Failed");
fuStyle = MB_APPLMODAL | MB_ABORTRETRYIGNORE; fuStyle |= MB_ICONSTOP;
DebugSz(szTitle); DebugSz(szMsgEx);
// dump the assert into ASSERT.TXT
#if !defined(WIN16)
hAssertTxt = CreateFile("assert.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL); if (INVALID_HANDLE_VALUE != hAssertTxt) { SetFilePointer(hAssertTxt, 0, NULL, FILE_END); GetLocalTime(&st); wsprintf(szTime, "\r\n\r\n%02d/%02d/%02d %d:%02d:%02d\r\n", st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond); WriteFile(hAssertTxt, szTime, lstrlen(szTime), &cbWritten, NULL); WriteFile(hAssertTxt, szMsgEx, lstrlen(szMsgEx), &cbWritten, NULL); CloseHandle(hAssertTxt); } #endif
id = MessageBox(NULL, szMsgEx, szTitle, fuStyle); switch (id) { case IDABORT: #if defined(WIN16)
exit(0); #else
ExitProcess(0); #endif
break; case IDCANCEL: case IDIGNORE: break; case IDRETRY: fAssertIntoDebugger = TRUE; break; } fInAssert = FALSE; return(fAssertIntoDebugger); } // AssertProc()
|