VCXX或VSXXXX 是如何让C++ Try/Catch来捕捉Windows SEH异常的?

Call我9527 2014-07-11 04:55:54
C++ 的Try/Catch可以用来捕捉异常,当用C++在写的Code里面的Try/Catch在Microsoft 的VC或VS下编译时,Try/Catch是否可以捕捉Windows操作系统本身产生的异常,或者Code执行过程中的硬件异常,例如除零错,非法地址访问等。
如果C++中的Tr/Catch可以捕捉操作系统异常以及硬件异常,我们知道Windows会把各种异常用SEH丢出来,那么VC或VS编译器是如何把SEH异常与C++的Try/Catch联系起来的呢?
...全文
841 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Call我9527 2014-07-16
  • 打赏
  • 举报
回复
引用 10 楼 fang098 的回复:
[quote=引用 7 楼 u014162303 的回复:] 回复6楼: 1. 操作系统是自己写的小型RTOS。 2. 需要捕捉异常的AP是用C++写的,目前是使用ARM 公司的编译器或Keil的编译器(实际上是同一个编译内核)。 这麽说我现在应该去研究ARM编译器编译出来异常捕捉代码是怎样的了。
楼主用的是stm32系列的MCU吗?keil不支持类处理方式,你的捕捉异常的AP是用C++写的,试下看Sourcery G++ lite 支不支持类处理方式,如果可以把C++代码生成库放到keil里面来用。[/quote] 1. CPU是ARM系列,ARM9/ARM11/Cortex AX。 2. 我先Study以下有关编译器编译处理异常捕捉的问题后在来,否则现在我显然跟不上各位的节奏啊。
Sandrer 2014-07-16
  • 打赏
  • 举报
回复
我一直以为 _try 这个异常处理叫 SHE,原来叫 SEH 吗
fang 2014-07-14
  • 打赏
  • 举报
回复
引用 7 楼 u014162303 的回复:
回复6楼: 1. 操作系统是自己写的小型RTOS。 2. 需要捕捉异常的AP是用C++写的,目前是使用ARM 公司的编译器或Keil的编译器(实际上是同一个编译内核)。 这麽说我现在应该去研究ARM编译器编译出来异常捕捉代码是怎样的了。
楼主用的是stm32系列的MCU吗?keil不支持类处理方式,你的捕捉异常的AP是用C++写的,试下看Sourcery G++ lite 支不支持类处理方式,如果可以把C++代码生成库放到keil里面来用。
  • 打赏
  • 举报
回复
C++异常处理要转化为汇编,SEH异常处理也要转化为汇编,编译器编译c++异常时编译为seh的汇编代码就完事了,并不需要一个显式的“结合”的过程
赵4老师 2014-07-14
  • 打赏
  • 举报
回复
个人意见:异常捕捉的再好也不如会分析Dump文件的Call Stack
Call我9527 2014-07-14
  • 打赏
  • 举报
回复
回复6楼: 1. 操作系统是自己写的小型RTOS。 2. 需要捕捉异常的AP是用C++写的,目前是使用ARM 公司的编译器或Keil的编译器(实际上是同一个编译内核)。 这麽说我现在应该去研究ARM编译器编译出来异常捕捉代码是怎样的了。
Henzox 2014-07-14
  • 打赏
  • 举报
回复
首先明确几点: 1. 异常是硬件的行为,操作系统只是把它易用化,比如 SEH 这样的结构化异常; 2. 编程语言只是在操作系统提供的机制的基础上进一步封装来达到自己的特性的。 基于以上两点,第一个你肯定知道了。关于你的问题,C++ 的异常处理也是建立在操作系统上的机制上实现的。所以需要操作系统和编译器一起共同实现这个基础,X86 的 windows 平台有复杂的异常处理机制,会建立异常处理链表,放在特定寄存器位置,然后 VC 编译器会提供相应的运行时库去注册自己的异常回调。现在既然你有了自己的操作系统,不知道是不是 Linux ,或者是自己的小型系统,你应该研究一下你使用的编译器支持的方式,它应该能够编译 C++,所以你只需要知道你的编译器编译出来的支持异常捕获的代码就行了,这个应该是可以查到的,那些编译器应该不是自己实现的,所以为它提供服务就行了。
Eleven 2014-07-14
  • 打赏
  • 举报
回复
硬件异常(比如除0错误),try-catch无法捕获,需要_try __execept/__finally 结构化异常来处理
Call我9527 2014-07-14
  • 打赏
  • 举报
回复
我要解决的实际问题是这样的。 我们在ARM平台上有一个项目,跑的是自己的操作系统,现在有些AP是用C++写的,AP开发者要求他们Code中的Try/Catch可以Catch到处理器异常或者提供AP开发者可以在C++中使用的捕捉处理器异常的方法。 我们知道ARM有定义几种异常中断,我们的OS已经有实现各种异常中断的服务程序,现在问题是我该如何将ARM的异常中断丢给AP中的异常处理代码,最好能直接丢给C++的Try/Catch来捕捉,这样会更方便易用。 对于解决这个问题我个人目前没有什么具体的想法,考虑到Windows上开发实际上也有类似的问题,比如用C++在Windows上开发,不知道这样的问题在Windows上是如何解决的,Windows的开发环境是如何设计来实现这样的需求的。 针对这样的需求,不知道那位可以指点迷津。谢谢。
  • 打赏
  • 举报
回复
这个看编译器实现啊,跟语言无关的。
dvlinker 2014-07-12
  • 打赏
  • 举报
回复
给你推荐一下,可以给Kenzox发个私信问一下,或者在博客中留言,他是这方面的专家 http://blog.csdn.net/henzox
shenyi0106 2014-07-11
  • 打赏
  • 举报
回复
c++的try catch只能捕获它自己产生的异常(throw),系统产生的(比如除0)C++是捕获不到的,需要SEH来捕获

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧