如何在Win32上捕获SIGSEGV与在Unix上不同?

时间:2010-10-19 12:19:10

标签: winapi mingw signals

我正在编写需要在Unix / Mac(使用GCC)和Win32(使用mingw)上编译和运行且无错误的代码。代码必须在各种不同的环境中运行,并且它具有我无法控制的可加载模块,因此我通常使用setjmp()和signal()保护每个模块。

我看到WIN32有setjmp()和signal()。代码是否可以移植,或者我需要担心吗?

1 个答案:

答案 0 :(得分:2)

来吧,担心。 CRT应模拟signal(),但MSVC明确提到longjmp()在处理程序中是不合法的,除非它处理SIGFPE。检查你的。

SIGSEGV的等价物是SEH异常,异常代码为0xc0000005(STATUS_ACCESS_VIOLATION)。 MSVC编译器允许使用__try和__except关键字捕获它们。

“保护”这样的模块的想法存在严重缺陷。您的程序状态已损坏,无法修复,您不知道它是如何变异的,因此您没有机会恢复它。继续运行可能会导致许多意外。如果它在另一个异常中死亡,你会很幸运,不知道真正的问题是什么,但它更可能只生成长时间无法诊断的坏数据。只是不写这样的代码你会好得多。并在此过程中解决您的移植问题。