c - C 中未调用异常处理程序

标签 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),但它没有被调用。我在异常处理程序(第一条指令)处设置了一个断点,但它从未到达该代码部分。

这可能是什么原因?

最佳答案

我遇到了同样的问题。它不起作用的原因是 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 函数。

关于c - C 中未调用异常处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19722308/

相关文章:

delphi - 在 C++ Builder 中启用安全异常处理

c++ - Visual Studio 6 何时捕获结构化异常?

C - 输入 2 个值,返回 2 个值到 MAIN。交换

c++ - 处理内存分配时的保护标志

c - 如何检测 GSM 调制解调器响应的最后一个字符

c++ - 函数体异常

jakarta-ee - Jersey:区分 session 超时和未授权

c - 应该使用哪个 4.x 版本的 gcc?

c# - 捕获 block 选择

c - 使用 Windows SEH 和 GCC 标签即值跳转到本地错误处理程序