【发布时间】:2014-07-04 16:15:23
【问题描述】:
我知道一般概述:http://msdn.microsoft.com/en-us/library/dn743843.aspx;关于win32的异常机制和一些win64的异常机制有很多可用的信息,但是ARM不是很清楚。
我想知道:当产生机器异常(内存保护违规)时,究竟控制权转移到哪里(这样我可以设置断点)?它会转移到内核模式吗?大概它从向量表中查找处理程序的地址并在那里传输。 kernel 代码是执行 SEH 展开,还是在用户模式下完成展开?如果在用户模式下,具体在哪里 - .exe、coredll 或其他地方的一部分?
背景
我们有一个大型应用程序,它将 __try / __except 处理程序放置在每个线程的顶层周围,以便以一种信息丰富的方式记录崩溃。这在 MIPS 上运行良好多年。我们现在将它移植到 ARM 上的 WinCE 7,在 VS2008 下构建。我们发现有时在发布版本中无法正确处理异常。这似乎取决于代码中生成异常的确切位置(我有一个测试函数,它故意访问 NULL 指针以引发 SEH 异常,我从代码中的不同位置调用它)。
我们正在使用 /EHsc 选项来启用 SEH。发布版本使用 /O2 /Os ;删除 /O2 使其工作但明显变慢。这让我相信优化器正在删除 SEH 工作所需的东西——但究竟是什么?并非所有函数都有“mov r12, sp ...”序言,但有些函数仍然不能正常工作。 PDATA中是否有错误? PDATA 条目的数量是否有上限? “dumpbin /pdata”的输出不是每一行都有函数名是正常的吗?
通过使用调试器(尽管发布版本),我可以在我的异常过滤函数(从 __except 调用)的开头放置一个断点,并观察它永远不会在失败情况下输入。程序刚刚退出。
【问题讨论】:
标签: c++ exception arm windows-ce