add debug helper lib for core dump generation on all supported windows targets

had an epiphany earlier

i kept having problems with static linking because
i merged the GNU C runtime with the SEH library
instead of merging the latter with pthread
pull/715/head
Rick V 5 years ago
parent 3d2dfcc027
commit 16096c6adb
No known key found for this signature in database
GPG Key ID: C0EDC8723FDC3465

@ -16,6 +16,7 @@
#ifdef _WIN32
#define wmin(x, y) (((x) < (y)) ? (x) : (y))
#define MIN wmin
extern "C" void win32_signal_handler(int);
#endif
struct llarp_main *ctx = 0;
@ -116,6 +117,7 @@ main(int argc, char *argv[])
if(startWinsock())
return -1;
SetConsoleCtrlHandler(handle_signal_win32, TRUE);
signal(SIGSEGV, win32_signal_handler);
#endif
#ifdef LOKINET_DEBUG

@ -22,6 +22,7 @@
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <wspiapi.h>
#include <lmcons.h>
#endif

@ -164,15 +164,14 @@ namespace llarp
HopHandler_ptr
PathContext::GetByUpstream(const RouterID& remote, const PathID_t& id)
{
auto own = MapGet(
m_OurPaths, id,
[](const PathSet_ptr) -> bool {
// TODO: is this right?
return true;
},
[remote, id](PathSet_ptr p) -> HopHandler_ptr {
return p->GetByUpstream(remote, id);
});
auto own = MapGet(m_OurPaths, id,
[](const PathSet_ptr) -> bool {
// TODO: is this right?
return true;
},
[remote, id](PathSet_ptr p) -> HopHandler_ptr {
return p->GetByUpstream(remote, id);
});
if(own)
return own;

@ -570,3 +570,106 @@ SetThreadName(DWORD dwThreadID, LPCSTR szThreadName)
CloseHandle(hThread);
}
#endif
#ifdef _WIN32
// Generate a core dump if we crash. Finally.
// Unix-style, we just leave a file named "core" in
// the user's working directory. Gets overwritten if
// a new crash occurs.
#include <dbghelp.h>
#ifdef _MSC_VER
#pragma comment(lib, "dbghelp.lib")
#endif
HRESULT
GenerateCrashDump(MINIDUMP_TYPE flags, EXCEPTION_POINTERS *seh)
{
HRESULT error = S_OK;
MINIDUMP_USER_STREAM_INFORMATION info = {0};
MINIDUMP_USER_STREAM *streamPtr = NULL;
MINIDUMP_USER_STREAM stream = {0};
// get the time
SYSTEMTIME sysTime = {0};
GetSystemTime(&sysTime);
// get the computer name
char compName[MAX_COMPUTERNAME_LENGTH + 1] = {0};
DWORD compNameLen = ARRAYSIZE(compName);
GetComputerNameA(compName, &compNameLen);
// This information is written to a core dump user stream
char extra_info[1024] = {0};
snprintf(extra_info, 1024,
"hostname=%s;datetime=%02u-%02u-%02u_%02u-%02u-%02u", compName,
sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour,
sysTime.wMinute, sysTime.wSecond);
// open the file
HANDLE hFile =
CreateFileA("core", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
error = GetLastError();
error = HRESULT_FROM_WIN32(error);
return error;
}
// get the process information
HANDLE hProc = GetCurrentProcess();
DWORD procID = GetCurrentProcessId();
// if we have SEH info, package it up
MINIDUMP_EXCEPTION_INFORMATION sehInfo = {0};
MINIDUMP_EXCEPTION_INFORMATION *sehPtr = NULL;
// Collect hostname and time
info.UserStreamCount = 1;
info.UserStreamArray = streamPtr;
streamPtr = &stream;
stream.Type = CommentStreamA;
stream.BufferSize = strlen(extra_info) + 1;
stream.Buffer = extra_info;
if(seh)
{
sehInfo.ThreadId = GetCurrentThreadId();
sehInfo.ExceptionPointers = seh;
sehInfo.ClientPointers = FALSE;
sehPtr = &sehInfo;
}
// generate the crash dump
BOOL result =
MiniDumpWriteDump(hProc, procID, hFile, flags, sehPtr, &info, NULL);
if(!result)
{
error = (HRESULT)GetLastError(); // already an HRESULT
}
// close the file
CloseHandle(hFile);
return error;
}
// ok try a UNIX-style signal handler
__declspec(noreturn) void win32_signal_handler(int s)
{
MessageBox(NULL,
"A fatal error has occurred. A core dump was generated and "
"dropped in the daemon's working directory. Please create an "
"issue at https://github.com/loki-network/loki-project, and "
"attach the core dump for further assistance.",
"Fatal Error", MB_ICONHAND);
GenerateCrashDump(
MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithThreadInfo
| MiniDumpWithProcessThreadData | MiniDumpWithFullMemoryInfo
| MiniDumpWithUnloadedModules | MiniDumpWithFullAuxiliaryState
| MiniDumpIgnoreInaccessibleMemory | MiniDumpWithTokenInformation,
NULL);
exit(127);
}
#endif

Binary file not shown.

Binary file not shown.

@ -68,11 +68,14 @@ Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescrip
#ifdef SINGLE_ARCH
Source: "{#DevPath}build\lokinet.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#DevPath}build\liblokinet-shared.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "dbghelp64.dll"; DestDir: "{app}\dbghelp.dll"; Flags: ignoreversion
#else
Source: "{#DevPath}build\lokinet.exe"; DestDir: "{app}"; Flags: ignoreversion 32bit; Check: not IsWin64
Source: "{#DevPath}build\liblokinet-shared.dll"; DestDir: "{app}"; Flags: ignoreversion 32bit; Check: not IsWin64
Source: "dbghelp32.dll"; DestName: "dbghelp.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not IsWin64
Source: "{#DevPath}build64\lokinet.exe"; DestDir: "{app}"; Flags: ignoreversion 64bit; Check: IsWin64
Source: "{#DevPath}build64\liblokinet-shared.dll"; DestDir: "{app}"; Flags: ignoreversion 64bit; Check: IsWin64
Source: "dbghelp64.dll"; DestDir: "{app}"; DestName: "dbghelp.dll"; Flags: ignoreversion; Check: IsWin64
#endif
; UI has landed!
#ifndef RELEASE

Loading…
Cancel
Save