不在C中调用异常处理程序

时间:2013-11-01 07:08:53

标签: c exception seh

我正在阅读C中的结构化异常处理。这是一个不能按预期工作的示例代码:

此代码取自此处:

http://msdn.microsoft.com/en-us/library/ha52ak6a.aspx

// C4733.cpp
// compile with: /W1 /c
// processor: x86
#include "stdlib.h"
#include "stdio.h"
void my_handler()
{
   printf("Hello from my_handler\n");
   exit(1);
}

int main()
{
   _asm {
      push    my_handler
      mov     eax, DWORD PTR fs:0
      push    eax
      mov     DWORD PTR fs:0, esp   // C4733
   }

   *(int*)0 = 0;
}

当尝试写入无效的内存地址触发异常时,此代码应打印消息“Hello from my_handler”。但是,似乎根本没有调用异常处理程序。

我编译了这段代码,并尝试使用Olly Debugger进行调试。当异常发生时,我尝试将异常传递给应用程序定义的异常处理程序(通过按,Shift + F9),但它不会被调用。我在异常处理程序(第一条指令)上设置了一个断点,但它永远不会到达那段代码。

这可能是什么原因?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。它不起作用的原因是my_handler在链接时被编译器阻止。 我们需要告诉编译器my_handler是安全的,或者完全禁用安全检查。因此,有两种方法可以使它工作。 (试过MSVC 2008和2010)

  • 在链接时添加/ safeseh:no禁用safeseh表。

    cl /c C4733.cpp
    link /safeseh:no C4733.obj 
    
  • 创建一个masm文件,将my_handler添加到SEH表中。但the SAFESEH example on MSN在我的笔记本电脑上无效。我在stackoverflow上找到了这个解决方案: Custom SEH handler with /SAFESEH。但我们必须创建一个额外的MASM过程来跳转到外部C函数。

相关问题