Ver Fonte

WITH_WINDUMP

ithewei há 6 anos atrás
pai
commit
f7add9a769
2 ficheiros alterados com 36 adições e 1 exclusões
  1. 3 0
      Makefile.in
  2. 33 1
      base/RAII.cpp

+ 3 - 0
Makefile.in

@@ -129,6 +129,9 @@ LDFLAGS += $(addprefix -l, $(LIBS))
 
 ifeq ($(OS), Windows)
 	LDFLAGS += -lwinmm -liphlpapi -lws2_32
+ifneq ($(findstring WITH_WINDUMP, $(DEFINES)), )
+	LDFLAGS += -ldbghelp
+endif
 	LDFLAGS += -Wl,-Bstatic -lstdc++ -lpthread -lm
 else
 ifeq ($(OS), Android)

+ 33 - 1
base/RAII.cpp

@@ -1,9 +1,41 @@
 #include "hplatform.h"
 
 #ifdef OS_WIN
+#ifdef WITH_WINDUMP
+#include <dbghelp.h>
+#ifdef _MSC_VER
+#pragma comment(lib,"dbghelp.lib")
+#endif
+static LONG UnhandledException(EXCEPTION_POINTERS *pException) {
+    char modulefile[256];
+    GetModuleFileName(NULL, modulefile, sizeof(modulefile));
+    char* pos = strrchr(modulefile, '\\');
+    char* modulefilename = pos + 1;
+    SYSTEMTIME st;
+    GetLocalTime(&st);
+    char filename[256];
+    snprintf(filename, sizeof(filename), "core_%s_%04d%02d%02d_%02d%02d%02d_%03d.dump",
+        modulefilename,
+        st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
+    HANDLE hDumpFile = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+    MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
+    dumpInfo.ExceptionPointers = pException;
+    dumpInfo.ThreadId = GetCurrentThreadId();
+    dumpInfo.ClientPointers = TRUE;
+    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
+    CloseHandle(hDumpFile);
+    return EXCEPTION_EXECUTE_HANDLER;
+}
+#endif
+
 class WsaRAII {
 public:
-    WsaRAII() { WSADATA wsadata; WSAStartup(MAKEWORD(2,2), &wsadata);
+    WsaRAII() {
+        WSADATA wsadata;
+        WSAStartup(MAKEWORD(2,2), &wsadata);
+#ifdef WITH_WINDUMP
+        SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)UnhandledException);
+#endif
     }
     ~WsaRAII() {
         WSACleanup();