如何在Windows下处理seg错误?

Windows应用程序如何处理分段错误? 通过“处理”我的意思是拦截他们,也许输出一个描述性的信息。 此外,从他们身上恢复的能力也会很好,但我认为这太复杂了。

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

让他们崩溃,并让Windows错误报告处理它 – 在Vista +,你也应该考虑注册与重新启动管理器,以便有机会拯救用户的工作,并重新启动应用程序(如什么Word / Excel /等..的确)

如果添加/EHa编译器参数,则try {} catch(...)将为您捕获所有异常,包括SEH异常。
您还可以使用__try {} __except {} ,这可以让您更灵活地捕获异常时的操作。 在整个main()函数中放置一个__try {} __except {}与使用SetUnhandeledExceptionFilter()相当。

这就是说,你也应该使用正确的术语。 “seg-fault”是一个UNIX术语。 窗口上没有分段错误。 在窗户上,他们被称为“访问违规exceopnts”

你想在这里做什么取决于你担心什么样的故障。 如果您的代码臃肿,容易出现或多或少的随机一般保护违规,那么@Paul贝茨答案就是您所需要的。

如果你的代码有很好的理由推迟坏指针,而你想恢复,那么从@ whunmr对SEH的建议开始吧。 如果你有足够明确的代码控制来确切地知道在故障点​​处的状态以及如何恢复,你就可以处理和确实恢复。

关于如何使用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 ++来运行)