-
-
Notifications
You must be signed in to change notification settings - Fork 113
/
Copy pathstack_printer.cpp
89 lines (78 loc) · 2.38 KB
/
stack_printer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#ifdef WINDOWS
#include <windows.h>
#include <dbghelp.h>
#include <cstdio>
#include "version.h"
#include "shellscalingapi.h"
int printStacktraceWithGdb() {
char gdbcmd[512] = {0};
sprintf(gdbcmd, "rungdb.bat \"" BUILD_VERSION " " BUILD_DATE "\"");
fputs(gdbcmd, stderr);
fflush(stderr);
return system(gdbcmd);
}
void miniDumpFunction(unsigned int nExceptionCode, EXCEPTION_POINTERS *pException) {
HANDLE hFile = CreateFileA("KeeperRL.dmp", GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) {
MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = GetCurrentThreadId();
mdei.ExceptionPointers = pException;
mdei.ClientPointers = FALSE;
MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(
MiniDumpWithDataSegs |
MiniDumpWithHandleData |
MiniDumpWithIndirectlyReferencedMemory |
MiniDumpWithThreadInfo |
MiniDumpWithUnloadedModules);
BOOL rv = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hFile, mdt, (pException != nullptr) ? &mdei : nullptr, nullptr, nullptr);
CloseHandle(hFile);
printStacktraceWithGdb();
}
}
LONG WINAPI miniDumpFunction2(EXCEPTION_POINTERS *ExceptionInfo) {
miniDumpFunction(123, ExceptionInfo);
return EXCEPTION_EXECUTE_HANDLER;
}
void initializeMiniDump() {
SetUnhandledExceptionFilter(miniDumpFunction2);
}
//#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
void attachConsole() {
if(AttachConsole(ATTACH_PARENT_PROCESS) || AllocConsole()){
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
if (handle != INVALID_HANDLE_VALUE) {
DWORD mode = 0;
if (GetConsoleMode(handle, &mode)) {
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(handle, mode);
}
}
}
}
void setConsoleColor(int col) {
auto handle = GetStdHandle(STD_OUTPUT_HANDLE);
FlushConsoleInputBuffer(handle);
SetConsoleTextAttribute(handle, col);
}
void dpiAwareness() {
SetProcessDPIAware();
}
extern "C"
{
__declspec( dllexport ) unsigned int NvOptimusEnablement = 0x00000001;
__declspec( dllexport ) int AmdPowerXpressRequestHighPerformance = 1;
}
#else
void attachConsole() {
}
void initializeMiniDump() {
}
void setConsoleColor(int) {
}
void dpiAwareness() {
}
#endif