Text file src/runtime/testdata/testwinlib/main.c

     1  #include <stdio.h>
     2  #include <windows.h>
     3  #include "testwinlib.h"
     4  
     5  int exceptionCount;
     6  int continueCount;
     7  LONG WINAPI customExceptionHandlder(struct _EXCEPTION_POINTERS *ExceptionInfo)
     8  {
     9      if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT)
    10      {
    11          exceptionCount++;
    12          // prepare context to resume execution
    13          CONTEXT *c = ExceptionInfo->ContextRecord;
    14          c->Rip = *(ULONG_PTR *)c->Rsp;
    15          c->Rsp += 8;
    16          return EXCEPTION_CONTINUE_EXECUTION;
    17      }
    18      return EXCEPTION_CONTINUE_SEARCH;
    19  }
    20  LONG WINAPI customContinueHandlder(struct _EXCEPTION_POINTERS *ExceptionInfo)
    21  {
    22      if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT)
    23      {
    24          continueCount++;
    25          return EXCEPTION_CONTINUE_EXECUTION;
    26      }
    27      return EXCEPTION_CONTINUE_SEARCH;
    28  }
    29  
    30  void throwFromC()
    31  {
    32      DebugBreak();
    33  }
    34  int main()
    35  {
    36      // simulate a "lazily" attached debugger, by calling some go code before attaching the exception/continue handler
    37      Dummy();
    38      exceptionCount = 0;
    39      continueCount = 0;
    40      void *exceptionHandlerHandle = AddVectoredExceptionHandler(0, customExceptionHandlder);
    41      if (NULL == exceptionHandlerHandle)
    42      {
    43          printf("cannot add vectored exception handler\n");
    44          fflush(stdout);
    45          return 2;
    46      }
    47      void *continueHandlerHandle = AddVectoredContinueHandler(0, customContinueHandlder);
    48      if (NULL == continueHandlerHandle)
    49      {
    50          printf("cannot add vectored continue handler\n");
    51          fflush(stdout);
    52          return 2;
    53      }
    54      CallMeBack(throwFromC);
    55      RemoveVectoredContinueHandler(continueHandlerHandle);
    56      RemoveVectoredExceptionHandler(exceptionHandlerHandle);
    57      printf("exceptionCount: %d\ncontinueCount: %d\n", exceptionCount, continueCount);
    58      fflush(stdout);
    59      return 0;
    60  }
    61  

View as plain text