如何在Windows下处理seg故障?

时间:2010-01-02 20:56:21

标签: windows fault

Windows应用程序如何处理分段错误?通过'句柄'我的意思是拦截它们并且可能输出描述性消息。此外,从它们中恢复的能力也会很好,但我认为这太复杂了。

6 个答案:

答案 0 :(得分:5)

让它们崩溃并让Windows错误报告处理它 - 在Vista +下,您还应该考虑使用Restart Manager注册,这样您就有机会保存用户的工作并重新启动应用程序(如Word / Excel /等等..确实)

答案 1 :(得分:3)

使用SEH进行早期异常处理, 并使用SetUnhandledExceptionFilter来显示描述性消息。

答案 2 :(得分:2)

如果添加/EHa编译器参数,那么try {} catch(...)将为您捕获所有异常,包括SEH例外。
您还可以使用__try {} __except {},这可以让您更灵活地捕获异常时的操作。在__try {} __except {}函数上放置main()有点等同于使用SetUnhandeledExceptionFilter()

话虽这么说,你也应该使用正确的术语。 “seg-fault”是一个UNIX术语。 Windows上没有分段错误。在Windows上,它们被称为“访问违规例外”

答案 3 :(得分:0)

您要在此处做什么取决于您所关注的故障类型。如果您的代码容易出现或多或少随机的一般保护违规行为,那么@Paul Betts的回答就是您所需要的。

如果你的代码有充分的理由去推断坏指针,并且想要恢复,请从@whunmr关于SEH的建议开始。如果您对代码有足够的控制权以确切知道故障点处的状态以及如何恢复,那么您可以处理并确实恢复。

答案 4 :(得分:0)

关于如何使用SetUnhandledExceptionFilter的C ++自包含示例,触发写入错误并显示错误消息:

#include <windows.h>
#include <sstream>

LONG WINAPI TopLevelExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
  std::stringstream s;
  s << "Fatal: Unhandled exception 0x" << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode 
  << std::endl;

  MessageBoxA(NULL, s.str().c_str(), "my application", MB_OK | MB_ICONSTOP);
  exit(1);

  return EXCEPTION_CONTINUE_SEARCH;
}

int main()
{
   SetUnhandledExceptionFilter(TopLevelExceptionHandler);
   int *v=0;
   v[12] = 0;   // should trigger the fault
   return 0;
}

使用g++成功测试(并且也可以使用MSVC ++)

答案 5 :(得分:0)

类似于Jean-FrançoisFabre解决方案,但在MinGW-w64中具有Posix代码。但是请注意,该程序必须退出-无法从SIGSEGV中恢复并继续。

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void sigHandler(int s)
{
    printf("signal %d\n", s);
    exit(1);
}

int main()
{
    signal(SIGSEGV, sigHandler);
    int *v=0;
    *v = 0;   // trigger the fault

    return 0; 
}