我正在阅读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;
}
Run Code Online (Sandbox Code Playgroud)
当尝试写入无效的内存地址触发异常时,此代码应打印消息"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
Run Code Online (Sandbox Code Playgroud)创建 masm 文件以将 my_handler 添加到 SEH 表中。但MSN 上的 SAFESEH 示例在我的笔记本电脑上无法运行。我在 stackoverflow 上找到了这个解决方案: Custom SEH handler with /SAFESEH。但我们必须创建一个额外的 MASM 过程来跳转到外部 C 函数。
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |