You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
4.1 KiB
C++
133 lines
4.1 KiB
C++
/************************************************************************/
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
|
/************************************************************************/
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
|
/* 1997-2001, All Rights Reserved */
|
|
/* */
|
|
/* MODULE NAME : msjexhnd.cpp */
|
|
/* PRODUCT(S) : */
|
|
/* */
|
|
/* MODULE DESCRIPTION : Unhandled Exception Hanlder */
|
|
/* */
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
|
/* */
|
|
/* MODIFICATION LOG : */
|
|
/* Date Who Rev Comments */
|
|
/* -------- --- ------ ------------------------------------------- */
|
|
/* 05/14/02 DSF 02 Added support for PDBs */
|
|
/* 02/08/02 MDE 01 Added Debug Exception and Slog support */
|
|
/************************************************************************/
|
|
|
|
#ifndef __MSJEXHND_H__
|
|
#define __MSJEXHND_H__
|
|
|
|
#define EXCEPTION_DIAGNOSTIC_DEBUG 0xE0000001
|
|
|
|
#ifdef __cplusplus
|
|
|
|
class MSJExceptionHandler
|
|
{
|
|
public:
|
|
|
|
MSJExceptionHandler( );
|
|
~MSJExceptionHandler( );
|
|
|
|
void SetLogFileName( PTSTR pszLogFileName );
|
|
#ifdef DEBUG_SISCO
|
|
static void SetLogCtrl (LOG_CTRL *pLogCtrl);
|
|
#endif
|
|
|
|
private:
|
|
|
|
// entry point where control comes on an unhandled exception
|
|
static LONG WINAPI MSJUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo );
|
|
|
|
// where report info is extracted and generated
|
|
static void GenerateExceptionReport( PEXCEPTION_POINTERS pExceptionInfo );
|
|
|
|
// Helper functions
|
|
static LPTSTR GetExceptionString( DWORD dwCode );
|
|
static BOOL GetLogicalAddress( PVOID addr, PTSTR szModule, DWORD len,
|
|
DWORD& section, DWORD& offset );
|
|
static void IntelStackWalk( PCONTEXT pContext );
|
|
#if 1
|
|
static void ImagehlpStackWalk( PCONTEXT pContext );
|
|
#endif
|
|
static int __cdecl _tprintf(const TCHAR * format, ...);
|
|
|
|
#if 1
|
|
static BOOL InitImagehlpFunctions( void );
|
|
#endif
|
|
|
|
// Variables used by the class
|
|
static TCHAR m_szPath[MAX_PATH];
|
|
static TCHAR m_szLogFileName[MAX_PATH];
|
|
static LPTOP_LEVEL_EXCEPTION_FILTER m_previousFilter;
|
|
#ifdef DEBUG_SISCO
|
|
static LOG_CTRL *m_pLogCtrl;
|
|
#endif
|
|
static HANDLE m_hReportFile;
|
|
static BOOL m_bDebugExcept;
|
|
static BOOL m_bFirstTime;
|
|
|
|
#if 1
|
|
// Make typedefs for some IMAGEHLP.DLL functions so that we can use them
|
|
// with GetProcAddress
|
|
typedef BOOL (__stdcall * SYMINITIALIZEPROC)( HANDLE, LPSTR, BOOL );
|
|
typedef BOOL (__stdcall *SYMCLEANUPPROC)( HANDLE );
|
|
|
|
typedef BOOL (__stdcall * STACKWALKPROC)
|
|
( DWORD, HANDLE, HANDLE, LPSTACKFRAME, LPVOID,
|
|
PREAD_PROCESS_MEMORY_ROUTINE,PFUNCTION_TABLE_ACCESS_ROUTINE,
|
|
PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE );
|
|
|
|
typedef LPVOID (__stdcall *SYMFUNCTIONTABLEACCESSPROC)( HANDLE, DWORD );
|
|
|
|
typedef DWORD (__stdcall *SYMGETMODULEBASEPROC)( HANDLE, DWORD );
|
|
|
|
typedef BOOL (__stdcall *SYMGETSYMFROMADDRPROC) ( HANDLE, DWORD, PDWORD, PIMAGEHLP_SYMBOL );
|
|
|
|
typedef BOOL (__stdcall *SYMGETSEARCHPATHPROC) ( HANDLE, PSTR, DWORD );
|
|
typedef BOOL (__stdcall *SYMSETSEARCHPATHPROC) ( HANDLE, PSTR );
|
|
|
|
typedef DWORD (__stdcall *SYMGETOPTIONSPROC) ();
|
|
typedef DWORD (__stdcall *SYMSETOPTIONSPROC) (DWORD);
|
|
typedef BOOL (__stdcall *SYMGETLINEFROMADDRPROC) (HANDLE, DWORD, PDWORD, PIMAGEHLP_LINE);
|
|
|
|
static SYMINITIALIZEPROC _SymInitialize;
|
|
static SYMCLEANUPPROC _SymCleanup;
|
|
static STACKWALKPROC _StackWalk;
|
|
static SYMFUNCTIONTABLEACCESSPROC _SymFunctionTableAccess;
|
|
static SYMGETMODULEBASEPROC _SymGetModuleBase;
|
|
static SYMGETSYMFROMADDRPROC _SymGetSymFromAddr;
|
|
static SYMGETSEARCHPATHPROC _SymGetSearchPath;
|
|
static SYMSETSEARCHPATHPROC _SymSetSearchPath;
|
|
|
|
static SYMGETOPTIONSPROC _SymGetOptions;
|
|
static SYMSETOPTIONSPROC _SymSetOptions;
|
|
static SYMGETLINEFROMADDRPROC _SymGetLineFromAddr;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
extern MSJExceptionHandler g_MSJExceptionHandler; // global instance of class
|
|
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
void ExpInit ();
|
|
void ExpRaiseDebugException ();
|
|
#ifdef DEBUG_SISCO
|
|
void ExpSetLogCtrl (LOG_CTRL *pLogCtrl);
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|