From e51c8a5cf66d1d3eb475b967f99587b5a59ca442 Mon Sep 17 00:00:00 2001 From: burlex Date: Tue, 4 Sep 2007 12:36:05 +0000 Subject: * Fixed some incorrect declarations in IOCPEngine * Fixed the virtual socket wrapper functions in IOCPEngine {these should really be inlined on unix} * Fixed several compilation issues under Win32 * Fixed calls to close() which should've been changed to SE->Close() + Added a crashdump saving system to Win32 builds. Dumps are saved in the format of dump-------.dmp in the working directory. Enabled by default, undefine ENABLE_CRASHDUMPS to disable. + Added m_operflood, this is a module I've had lying around for some time but some users may like it as it allows unreal-like behaviour without increasing flood limits for non-opers. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8015 e03df62e-2008-0410-955e-edbf42e46eb7 --- win/inspircdVC71.vcproj | 2 +- win/inspircd_win32wrapper.cpp | 64 +++++++++++++++++++++++++++++++++++++++++++ win/inspircd_win32wrapper.h | 10 +++++++ 3 files changed, 75 insertions(+), 1 deletion(-) (limited to 'win') diff --git a/win/inspircdVC71.vcproj b/win/inspircdVC71.vcproj index 1bcac8fcd..60dbaad0c 100644 --- a/win/inspircdVC71.vcproj +++ b/win/inspircdVC71.vcproj @@ -33,7 +33,7 @@ Name="VCCustomBuildTool"/> tv_usec = (mstime - (tv->tv_sec * 1000)) * 1000; return 0; } + +int __exceptionHandler(PEXCEPTION_POINTERS pExceptPtrs) +{ + SYSTEMTIME _time; + HANDLE hDump; + char mod[MAX_PATH*2]; + char * pMod = mod; + char dump_filename[MAX_PATH]; + MINIDUMP_EXCEPTION_INFORMATION dumpInfo; + DWORD code; + + if(pExceptPtrs == NULL) { + __try { + RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL); + } __except(__exceptionHandler(GetExceptionInformation()), EXCEPTION_CONTINUE_EXECUTION) {} + } + + printf("Exception caught at 0x%.8X! Attempting to write crash dump file.\n", (unsigned long)pExceptPtrs->ExceptionRecord->ExceptionAddress); + + if(GetModuleFileName(0, mod, MAX_PATH*2) > 0) + { + if( (pMod = strrchr(mod, '\\')) != NULL ) + ++pMod; + else + strcpy(mod, "unk"); + } + else + strcpy(mod, "unk"); + + GetSystemTime(&_time); + snprintf(dump_filename, MAX_PATH, "dump-%s-%u-%u-%u-%u-%u-%u.dmp", + pMod, _time.wYear, _time.wMonth, _time.wDay, _time.wHour, _time.wMinute, _time.wSecond); + + hDump = CreateFile(dump_filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, 0); + if(hDump != INVALID_HANDLE_VALUE) + { + dumpInfo.ClientPointers = FALSE; + dumpInfo.ExceptionPointers = pExceptPtrs; + dumpInfo.ThreadId = GetCurrentThreadId(); + + /* let's write a full memory dump. insp shouldn't be using much memory anyway, and it will help a lot with debugging. */ + MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDump, MiniDumpWithFullMemory, &dumpInfo, NULL, NULL); + FlushFileBuffers(hDump); + CloseHandle(hDump); + } + + /* check for a debugger */ + __asm { + pushad + pushfd + mov eax, fs:[18h] + mov eax, dword ptr [eax+30h] + mov ebx, dword ptr [eax] + mov code, ebx + popfd + popad + } + + /* break into debugger if we have one */ + if(code & 0x10000) + return EXCEPTION_CONTINUE_SEARCH; + else /* otherwise exit abnormally */ + return EXCEPTION_CONTINUE_EXECUTION; +} diff --git a/win/inspircd_win32wrapper.h b/win/inspircd_win32wrapper.h index 6d03d0507..a6d023c56 100644 --- a/win/inspircd_win32wrapper.h +++ b/win/inspircd_win32wrapper.h @@ -21,6 +21,7 @@ /* Define the WINDOWS macro. This means we're building on windows to the rest of the server. I think this is more reasonable than using WIN32, especially if we're gonna be doing 64-bit compiles */ #define WINDOWS 1 +#define ENABLE_CRASHDUMPS 1 /* Make builds smaller, leaner and faster */ #define VC_EXTRALEAN @@ -70,6 +71,10 @@ #include #include +#ifdef ENABLE_CRASHDUMPS +#include +#endif + /* strcasecmp is not defined on windows by default */ #define strcasecmp _stricmp @@ -199,5 +204,10 @@ void ChangeWindowsSpecificPointers(InspIRCd* Instance); bool ValidateWindowsDnsServer(ServerConfig* conf, const char* tag, const char* value, ValueItem &data); +#ifdef ENABLE_CRASHDUMPS +typedef struct _EXCEPTION_POINTERS EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; +int __cdecl __exceptionHandler(PEXCEPTION_POINTERS pExceptPtrs); +#endif + #endif -- cgit v1.2.3