我正在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.h
和ntstatus.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;
}