Commit d7eca387 authored by vaillancour's avatar vaillancour
Browse files

improve stack printing for windows

parent e90f6ade
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -175,6 +175,8 @@ static Word16 saturate (Word32 L_var1);
#elif defined _WIN32 || defined _WIN64
#include <windows.h>
#include <dbghelp.h>
#pragma comment(lib, "Dbghelp.lib")

/* Using macro instead of function here to avoid pushing new frames onto the stack */
#define PRINT_STACK()                                                          \
  do {                                                                         \
@@ -195,14 +197,26 @@ static Word16 saturate (Word32 L_var1);
    module.SizeOfStruct = sizeof(IMAGEHLP_MODULE64);                           \
                                                                               \
    num_frames = CaptureStackBackTrace(0, 100, call_stack, NULL);              \
    if (num_frames > 11) num_frames -=8;                                       \
    for (i = 0; i < num_frames; ++i) {                                         \
      SymFromAddr(process, (DWORD64)(call_stack[i]), &offset, symbol);         \
      SymGetModuleInfo(process, (DWORD)symbol->ModBase, &module);              \
      IMAGEHLP_LINE *supp_info = (IMAGEHLP_LINE *)calloc(sizeof(IMAGEHLP_LINE), 1);                 \
      supp_info->SizeOfStruct = sizeof(IMAGEHLP_LINE);                                              \
      DWORD dwLineDisplacement;                                                                     \
      if (SymGetLineFromAddr(process, (DWORD64)(call_stack[i]), &dwLineDisplacement, supp_info)) {  \
        if (i < 3){                                                                                 \
            printf("[BASOP] %i\t%s(%s+0x%llX) [0x%llX]\n", i, module.ModuleName,                    \
                    symbol->Name, offset, symbol->Address);                                         \
        } else {                                                                                    \
            printf("[BASOP] %i\t%s(%s+0x%llX) [0x%llX] %s:%d\n", i, module.ModuleName,              \
                    symbol->Name, offset, symbol->Address, supp_info->FileName, supp_info->LineNumber); \
        }                                                                                           \
      }                                                                                             \
    }                                                                                               \
    free(symbol);                                                                                   \
  } while (0)

#else
#define PRINT_STACK()                                                          \
  do {                                                                         \