From 502ee6a4976fd08f3674fe13e9731c380f63e88c Mon Sep 17 00:00:00 2001 From: ljx0305 Date: Sat, 11 Apr 2026 09:39:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=9C=A8window=20mingw=205.3?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=8B=E7=BC=96=E8=AF=91=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=A1=E6=81=AF=20(#4710)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决在window mingw 5.3环境下编译出现如下报错信息 no known conversion from 'LONG (*)(EXCEPTION_POINTERS*) {aka long int (*)(_EXCEPTION_POINTERS*)}' to 'LPTOP_LEVEL_EXCEPTION_FILTER {aka long int (__attribute__((__stdcall__)) *)(_EXCEPTION_POINTERS*)}' --- server/System.cpp | 50 +++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/server/System.cpp b/server/System.cpp index c76af03e..6c4a7b3f 100644 --- a/server/System.cpp +++ b/server/System.cpp @@ -185,6 +185,32 @@ void System::startDaemon(bool &kill_parent_if_failed) { #endif // _WIN32 } +#ifdef _WIN32 +static LONG __stdcall customUnhandledExceptionFilter(EXCEPTION_POINTERS *pException) { + // 生成 dump 文件名,带时间戳 + char dumpPath[MAX_PATH]; + std::time_t t = std::time(nullptr); + std::tm tm; +#ifdef _MSC_VER + localtime_s(&tm, &t); +#else + tm = *std::localtime(&t); +#endif + std::strftime(dumpPath, sizeof(dumpPath), "crash_%Y%m%d_%H%M%S.dmp", &tm); + + HANDLE hFile = CreateFileA(dumpPath, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + if (hFile != INVALID_HANDLE_VALUE) { + MINIDUMP_EXCEPTION_INFORMATION mdei; + mdei.ThreadId = GetCurrentThreadId(); + mdei.ExceptionPointers = pException; + mdei.ClientPointers = FALSE; + MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, nullptr, nullptr); + CloseHandle(hFile); + } + return EXCEPTION_EXECUTE_HANDLER; +} +#endif//!defined(_WIN32) + void System::systemSetup(){ #ifdef ENABLE_JEMALLOC_DUMP @@ -238,29 +264,7 @@ void System::systemSetup(){ std::ios_base::sync_with_stdio(false); // 注册crash自动生成dump(等价core dump) - SetUnhandledExceptionFilter([](EXCEPTION_POINTERS *pException) -> LONG { - // 生成 dump 文件名,带时间戳 - char dumpPath[MAX_PATH]; - std::time_t t = std::time(nullptr); - std::tm tm; -#ifdef _MSC_VER - localtime_s(&tm, &t); -#else - tm = *std::localtime(&t); -#endif - std::strftime(dumpPath, sizeof(dumpPath), "crash_%Y%m%d_%H%M%S.dmp", &tm); - - HANDLE hFile = CreateFileA(dumpPath, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); - if (hFile != INVALID_HANDLE_VALUE) { - MINIDUMP_EXCEPTION_INFORMATION mdei; - mdei.ThreadId = GetCurrentThreadId(); - mdei.ExceptionPointers = pException; - mdei.ClientPointers = FALSE; - MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, nullptr, nullptr); - CloseHandle(hFile); - } - return EXCEPTION_EXECUTE_HANDLER; - }); + SetUnhandledExceptionFilter(customUnhandledExceptionFilter); #endif//!defined(_WIN32) }