From e9fcbad86cb98e9b4d373f07babf5c4cfce20f16 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Mon, 14 Apr 2025 08:17:31 +0200 Subject: [PATCH] yes --- Tests/main.c | 31 ++++++++++++++++++++++--------- Tests/xmake.lua | 3 +++ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Tests/main.c b/Tests/main.c index 760f05d..4249ad7 100644 --- a/Tests/main.c +++ b/Tests/main.c @@ -44,17 +44,17 @@ LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo) { fprintf(stderr, "Exception occurred!\n"); - PrintStackTrace(); + FollowStackTrace(); return EXCEPTION_EXECUTE_HANDLER; } - void PrintStackTrace() + void FollowStackTrace() { - // Initialize symbols HANDLE process = GetCurrentProcess(); SymInitialize(process, NULL, TRUE); - // Capture stack backtrace + SymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_UNDNAME); + void* stack[62]; USHORT frames = CaptureStackBackTrace(0, 62, stack, NULL); @@ -62,12 +62,25 @@ symbol->MaxNameLen = 255; symbol->SizeOfStruct = sizeof(SYMBOL_INFO); - for(USHORT i = 0; i < frames; i++) - { - SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol); - fprintf(stderr, "[%d] %s - 0x%0llX\n", i, symbol->Name, symbol->Address); - } + IMAGEHLP_LINE64 line; + DWORD displacement; + ZeroMemory(&line, sizeof(IMAGEHLP_LINE64)); + line.SizeOfStruct = sizeof(IMAGEHLP_LINE64); + for (USHORT i = 0; i < frames; i++) + { + DWORD64 address = (DWORD64)(stack[i]); + if(SymFromAddr(process, address, 0, symbol)) + { + fprintf(stderr, "[%d] %s - 0x%0llX", i, symbol->Name, symbol->Address); + if(SymGetLineFromAddr64(process, address, &displacement, &line)) + fprintf(stderr, " (%s:%lu)\n", line.FileName, line.LineNumber); + else + fprintf(stderr, " (no file info)\n"); + } + else + fprintf(stderr, "[%d] (unable to resolve symbol)\n", i); + } free(symbol); } #endif diff --git a/Tests/xmake.lua b/Tests/xmake.lua index 8d262ef..8b90ad0 100644 --- a/Tests/xmake.lua +++ b/Tests/xmake.lua @@ -206,6 +206,9 @@ for name, module in pairs(tests) do add_defines("BACKTRACE") elseif is_plat("windows") then add_defines("WINTRACE") + add_cflags("/Zi") + add_ldflags("/DEBUG") + add_links("dbghelp") end target_end() end