加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何在Windows上为C中的访问冲突错误安装信号处理程序?

发布时间:2020-12-14 03:59:50 所属栏目:Windows 来源:网络整理
导读:我有一个错误的应用程序在 Windows上引发访问冲突.这会弹出Windows上的“崩溃对话框”,我不希望它出现在用户的计算机上.在 Linux上,我会为SIGSEGV安装一个信号处理程序,只在sighandler函数中安装exit(),但我在Windows上,而且我对Windows API几乎一无所知. 据
我有一个错误的应用程序在 Windows上引发访问冲突.这会弹出Windows上的“崩溃对话框”,我不希望它出现在用户的计算机上.在 Linux上,我会为SIGSEGV安装一个信号处理程序,只在sighandler函数中安装exit(),但我在Windows上,而且我对Windows API几乎一无所知.

据我所知,当发生段错误时,Windows会抛出异常ACCESS_VIOLATION.我认为这是一个常规的C异常并且可以捕获它,但我需要修补的程序是C,而不是C.如何在Windows上安装“信号处理程序”? (假设信号的概念存在,考虑到signal()和朋友是POSIX API)? this API是作为核心API实现的,还是POSIX兼容层的一部分,可能不会出现在vanilla部署中?

我在Win7上使用VS2008

解决方法

这不是一个“常规C异常”.这是一个操作系统陷阱.

在Linux和其他类Unix系统上,OS陷阱被称为“信号”.

在Windows上,它们被称为“结构化异常”.你会在网上找到关于SEH的信息,它代表结构化异常处理.官方文档是on MSDN

Windows C和C编译器具有用于处理结构化异常的特殊关键字

__try {
}
__except( MyExceptionFilter(GetExceptionCode(),GetExceptionInfo()) ) {
}

在异常过滤器中,您可以检查异常代码并区分访问冲突,除以零,浮点信号等.您可以找出异常发生的位置并记录堆栈跟踪(有一些额外的工作).您可以选择是否运行处理程序代码块.

在下面,这些关键字被转换为使用向量异常处理程序表之类的数据结构设置陷阱处理程序的代码.但是你真的想要编译器的帮助而不是自己动手.看到内部实现只是编译器开发人员感兴趣的,或者如果出现问题,您必须通过它进行调试.

1根据您的编译选项,在Visual C中它是/ EHa和/ EHs选项,C异常可能建立在SEH之上(有一个特殊的异常代码,意思是“Microsoft C异常”),指向C异常对象的指针是存储在SEH参数中).当发生这种情况时,C try / catch和SEH __try / __的堆栈展开除了/ __ finally是统一的 – 两个异常都通过两种处理程序样式展开.对于在同一程序中同时使用C异常和SEH的人来说,__ set_se_translator函数也很有趣.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读