#include "postgres.h"#include <windows.h>#include <string.h>#include <dbghelp.h>
Go to the source code of this file.
Defines | |
| #define | WIN32_LEAN_AND_MEAN |
Typedefs | |
| typedef DWORD | dwPid |
| typedef DWORD HANDLE | hFile |
| typedef DWORD HANDLE MINIDUMP_TYPE | DumpType |
| typedef DWORD HANDLE MINIDUMP_TYPE CONST PMINIDUMP_EXCEPTION_INFORMATION | ExceptionParam |
| typedef DWORD HANDLE MINIDUMP_TYPE CONST PMINIDUMP_EXCEPTION_INFORMATION CONST PMINIDUMP_USER_STREAM_INFORMATION | UserStreamParam |
| typedef DWORD HANDLE MINIDUMP_TYPE CONST PMINIDUMP_EXCEPTION_INFORMATION CONST PMINIDUMP_USER_STREAM_INFORMATION CONST PMINIDUMP_CALLBACK_INFORMATION | CallbackParam |
Functions | |
| typedef | BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess |
| static LONG WINAPI | crashDumpHandler (struct _EXCEPTION_POINTERS *pExceptionInfo) |
| void | pgwin32_install_crashdump_handler (void) |
| #define WIN32_LEAN_AND_MEAN |
Definition at line 41 of file crashdump.c.
| typedef DWORD HANDLE MINIDUMP_TYPE CONST PMINIDUMP_EXCEPTION_INFORMATION CONST PMINIDUMP_USER_STREAM_INFORMATION CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam |
Definition at line 60 of file crashdump.c.
| typedef DWORD HANDLE MINIDUMP_TYPE DumpType |
Definition at line 60 of file crashdump.c.
| typedef DWORD dwPid |
Definition at line 60 of file crashdump.c.
| typedef DWORD HANDLE MINIDUMP_TYPE CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam |
Definition at line 60 of file crashdump.c.
| typedef DWORD HANDLE hFile |
Definition at line 60 of file crashdump.c.
| typedef DWORD HANDLE MINIDUMP_TYPE CONST PMINIDUMP_EXCEPTION_INFORMATION CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam |
Definition at line 60 of file crashdump.c.
| typedef BOOL | ( | WINAPI * | MINIDUMPWRITEDUMP | ) |
Referenced by pg_signal_thread(), pgwin32_is_admin(), and spawn_process().
| static LONG WINAPI crashDumpHandler | ( | struct _EXCEPTION_POINTERS * | pExceptionInfo | ) | [static] |
Definition at line 79 of file crashdump.c.
References NULL, snprintf(), and write_stderr.
Referenced by pgwin32_install_crashdump_handler().
{
/*
* We only write crash dumps if the "crashdumps" directory within the
* postgres data directory exists.
*/
DWORD attribs = GetFileAttributesA("crashdumps");
if (attribs != INVALID_FILE_ATTRIBUTES && (attribs & FILE_ATTRIBUTE_DIRECTORY))
{
/* 'crashdumps' exists and is a directory. Try to write a dump' */
HMODULE hDll = NULL;
MINIDUMPWRITEDUMP pDump = NULL;
MINIDUMP_TYPE dumpType;
char dumpPath[_MAX_PATH];
HANDLE selfProcHandle = GetCurrentProcess();
DWORD selfPid = GetProcessId(selfProcHandle);
HANDLE dumpFile;
DWORD systemTicks;
struct _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
ExInfo.ThreadId = GetCurrentThreadId();
ExInfo.ExceptionPointers = pExceptionInfo;
ExInfo.ClientPointers = FALSE;
/* Load the dbghelp.dll library and functions */
hDll = LoadLibrary("dbghelp.dll");
if (hDll == NULL)
{
write_stderr("could not load dbghelp.dll, cannot write crash dump\n");
return EXCEPTION_CONTINUE_SEARCH;
}
pDump = (MINIDUMPWRITEDUMP) GetProcAddress(hDll, "MiniDumpWriteDump");
if (pDump == NULL)
{
write_stderr("could not load required functions in dbghelp.dll, cannot write crash dump\n");
return EXCEPTION_CONTINUE_SEARCH;
}
/*
* Dump as much as we can, except shared memory, code segments, and
* memory mapped files. Exactly what we can dump depends on the
* version of dbghelp.dll, see:
* http://msdn.microsoft.com/en-us/library/ms680519(v=VS.85).aspx
*/
dumpType = MiniDumpNormal | MiniDumpWithHandleData |
MiniDumpWithDataSegs;
if (GetProcAddress(hDll, "EnumDirTree") != NULL)
{
/* If this function exists, we have version 5.2 or newer */
dumpType |= MiniDumpWithIndirectlyReferencedMemory |
MiniDumpWithPrivateReadWriteMemory;
}
systemTicks = GetTickCount();
snprintf(dumpPath, _MAX_PATH,
"crashdumps\\postgres-pid%0i-%0i.mdmp",
(int) selfPid, (int) systemTicks);
dumpPath[_MAX_PATH - 1] = '\0';
dumpFile = CreateFile(dumpPath, GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
if (dumpFile == INVALID_HANDLE_VALUE)
{
write_stderr("could not open crash dump file \"%s\" for writing: error code %lu\n",
dumpPath, GetLastError());
return EXCEPTION_CONTINUE_SEARCH;
}
if ((*pDump) (selfProcHandle, selfPid, dumpFile, dumpType, &ExInfo,
NULL, NULL))
write_stderr("wrote crash dump to file \"%s\"\n", dumpPath);
else
write_stderr("could not write crash dump to file \"%s\": error code %lu\n",
dumpPath, GetLastError());
CloseHandle(dumpFile);
}
return EXCEPTION_CONTINUE_SEARCH;
}
| void pgwin32_install_crashdump_handler | ( | void | ) |
Definition at line 167 of file crashdump.c.
References crashDumpHandler().
Referenced by main().
{
SetUnhandledExceptionFilter(crashDumpHandler);
}
1.7.1