C++ MSVC x64 中尝试捕获子句"Skips"例外
C++ Exception "Skips" Try-Catch Clause in MSVC x64
我正在用C++编写一个程序。该程序在Win32(x86)上运行良好,最近我尝试为x64本机编译它。当然,这些东西并没有马上起作用。
调试问题后,我设法用这个简单的代码片段重现它:
class MyException { };
int main()
{
try {
for (;;) {
try {
std::cout << "Throwing" << std::endl;
throw MyException();
if (1 == 0) {
continue;
}
} catch (const MyException&) {
std::cout << "Catch 1" << std::endl;
}
}
} catch (const MyException&) {
std::cout << "Catch 2" << std::endl;
}
std::cout << "Done" << std::endl;
return 0;
}
(我很快就会解释if (1==0)
条款)
使用 x86 的 MSVC 编译此代码时(我使用了 2010),结果符合预期:
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
...
依此类推,在一个无限循环中。
但是,为 x64 编译此代码会导致:
Throwing
Catch 2
Done
该例外完全跳过了内部捕获子句!
仅当 if (1 ==0)
子句存在于我的代码中时,才会发生这种情况。当我删除它时,异常按预期在"Catch 1"中捕获。
我尝试使用其他编译器:
- 此错误也发生在VS 2012中。
- MinGW和MinGW-w64按预期工作。
我的问题:这是一个 MSVC 错误,还是我丢失C++中的一些未定义的行为?如果这确实是MSVC错误,我很想听听有关原因的一些见解。
谢谢。
此错误可能与编译器优化有关 - 有趣的是,链接器在发布版本中崩溃(理论上会打开完全优化)。
您的调试版本是否完全禁用了优化 (/Od)?
Visual Studio 帮助还包含一个语句(在"优化最佳做法"下),不鼓励 64 位代码中的 try/catch 块。
如果在发布版本中关闭优化,链接器不会崩溃。 如果您只删除"继续"语句,它也不会崩溃(但会重现不良行为)。
if (1==0) {
//continue;
}
尝试切换/FAs 开关:
http://msdn.microsoft.com/en-us/library/367y26c6%28v=vs.80%29.ASPX
在"编译器设置"的"附加输出文件"中的某个位置。(确保所有其他设置相同)
然后,在两个输出之间做一个差异。 在此处发布差异。我相信有些人会告诉你为什么和如何,也许还有一些编译器设置或代码解决方法。
古老的已知问题,在挖掘出来之后,这就是我们前段时间发现的。
http://social.msdn.microsoft.com/Forums/en-US/19eb8218-0dc4-4e4f-954f-4c4c3b3cd118/why-am-i-not-being-alerted-of-exceptions-from-methods-that-are-run-when-the-application-loads?forum=csharpide
- 如何理解C++标准N3337中的expr.const.cast子句8
- if 子句中的赋值不起作用
- C++20 概念:如何在"requires"子句中引用类名?
- 尝试将另一个子句添加到代码中时出错
- 对OpenMP reduction子句中的变量执行原子操作
- 要求子句中不允许哪些替换失败?
- "using namespace"子句在什么范围内有效?
- 在编译时计算"if"子句
- OpenMP 条件并行化 - 并行部分中 if 子句的语法
- 在 CPP 中使用正则表达式将密码("ABC")子句屏蔽为密码("****")
- 如何加快有序子句的 openmp 并行速度?
- 当使用 require 表达式指定和不使用 require 表达式指定 require 子句时,C++ gcc HEAD
- if子句中的有条件分配
- 谷歌模拟 - 保存EXPECT_CALL然后重复使用和更改子句
- 如何摆脱If-Elif-Else子句
- 为什么可变参数模板在模板介绍中不起作用,但在要求子句中起作用?ConceptName{T,U,V,W} <-- template<typename ...T>
- 在 SQLAPI c++ 中向 IN 子句添加多个参数
- 在C 中使用OpenMP共享子句
- 在if子句中自动分配
- C++ MSVC x64 中尝试捕获子句"Skips"例外