From b10a22218fa81c34ea10f50049562b431d2465dd Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 29 Nov 2023 18:28:15 +0000 Subject: [PATCH] Window crash log: Reduce sensitivity of stack infinite loop detection Only trigger if 8 previous frames are the same, not only 1 --- src/os/windows/crashlog_win.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 4c1faf94d9..f44b5786e9 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -401,6 +401,8 @@ static const uint MAX_FRAMES = 64; sym_info->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); sym_info->MaxNameLength = MAX_SYMBOL_LEN; + std::array last_offsets = {}; + /* Walk stack at most MAX_FRAMES deep in case the stack is corrupt. */ for (uint num = 0; num < MAX_FRAMES; num++) { auto guard = scope_guard([&]() { @@ -414,11 +416,13 @@ static const uint MAX_FRAMES = 64; #endif hCur, GetCurrentThread(), &frame, &ctx, nullptr, proc.pSymFunctionTableAccess64, proc.pSymGetModuleBase64, nullptr)) break; - if (frame.AddrPC.Offset == frame.AddrReturn.Offset) { + if (std::find_if(last_offsets.begin(), last_offsets.end(), [&](DWORD64 offset) { return offset != frame.AddrPC.Offset; }) == last_offsets.end()) { buffer += seprintf(buffer, last, " \n"); break; } + last_offsets[num % last_offsets.size()] = frame.AddrPC.Offset; + /* Get module name. */ const char *mod_name = "???"; const char *image_name = nullptr;