如何在矢量异常处理程序中打印信息错误消息?

时间:2018-11-07 12:59:10

标签: windows winapi

我正在Windows上编写命令行C ++程序,有时不可避免地会遇到诸如堆栈溢出或访问冲突之类的错误。在这种情况下,我希望它在退出前打印出一条有用的错误消息。这是我目前所拥有的:

AddVectoredExceptionHandler(0, handler);

LONG WINAPI handler(_EXCEPTION_POINTERS *ExceptionInfo) {
  if (ExceptionInfo->ExceptionRecord->ExceptionCode ==
      EXCEPTION_STACK_OVERFLOW) {
    puts("stack overflow");
    ExitProcess(1);
  }
  printf("exception %X", ExceptionInfo->ExceptionRecord->ExceptionCode);
  ExitProcess(1);
}

堆栈溢出的特殊情况是因为我发现puts在这种情况下有效,但printf却没有。是因为剩余的堆栈空间太少,以至于只有最简单的函数才能工作,还是因为堆栈被损坏而varargs无法工作?

现在,我收到异常C0000005。我查看了minwinbase.hntstatus.h中的定义,发现这是STATUS_ACCESS_VIOLATION。知道哪个有用!如果我可以获取更多详细信息以及自动进行查找,那就更好了。我注意到头文件中附带的注释说

// MessageText:
//
// The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.

一个格式字符串,表明可以自动打印此信息。这是怎么做的?

最小,完整且可验证的示例,使用cl main.cc进行编译:

#include <stdio.h>
#include <windows.h>

LONG WINAPI handler(_EXCEPTION_POINTERS *ExceptionInfo) {
  if (ExceptionInfo->ExceptionRecord->ExceptionCode ==
      EXCEPTION_STACK_OVERFLOW) {
    puts("stack overflow");
    ExitProcess(1);
  }
  printf("exception %X\n", ExceptionInfo->ExceptionRecord->ExceptionCode);
  ExitProcess(1);
}

void overflow() { overflow(); }

int main(int argc, const char **argv) {
  AddVectoredExceptionHandler(0, handler);

  // demonstrate access violation
  *(int *)0 = 0;

  // demonstrate stack overflow
  overflow();

  return 0;
}

0 个答案:

没有答案