VS-2019 程序在某些服务器上的第一条浮点指令上崩溃
VS-2019 program crashes on first floating point instruction on some servers
我有一个代码可以运行多年的服务。
现在使用 VS-2019 16.3.7/8/9 我得到 0xC000001D(线程试图执行无效指令。)在某些机器上服务启动阶段的第一个浮点算法异常.
安装使用 16.2.4/5 编译的相同代码库。
我有一台机器的完整内存故障转储。崩溃发生在调用 _dtol3
.
时
我在汇编代码中可以看到这种情况。
0149477B 83 3D B4 AC 55 01 06 cmp dword ptr [__isa_available (0155ACB4h)],6
01494782 7C 15 jl _dtol3_default (01494799h)
01494784 C5 FA 7E C0 vmovq xmm0,xmm0
01494788 62 F1 FD 08 7A C0 vcvttpd2qq xmm0,xmm0 <---- CRASH
__isa_available
的值为 6。在我的机器上,该值为 5。我们可以看到崩溃的一台机器是 XEON Silver 4110
运行 我们的软件虚拟化。相同的 exe 在 XEON E5-2620
上运行。相同的 exe 在我公司的所有客户端机器上运行没有任何问题(新旧英特尔机器的混合)。
查看调用的代码,我可以看到将它与大于或等于 1.0 的值进行比较时,有一个简单的差异和除法。
COleDateTime nowClient = COleDateTime::GetCurrentTime(),
nowDB = GetCurrentTime();
COleDateTimeSpan diff = nowDB-nowClient;
if (diff.GetTotalMinutes()>=1) // <----- CRASH
...
有没有办法影响VS中的代码创建,避免调用这段代码? (任何垫片、兼容性设置)
自 VS 16.2.4 以来,VS-2019 是否有任何已知的影响浮动数学的变化,这可能会影响我的问题?
您可以在其 "Properties" sheet:
中为每个项目启用或禁用 [=32=] 指令的生成
- 在解决方案资源管理器中右键单击项目,然后从弹出菜单中 select "Properties"。
- Select/Open 左侧窗格中的 "C/C++" 选项卡,然后 select "Code Generation" 项。
- 然后在右侧窗格中显示的属性列表中,select "Not Set" 用于 "Enabled Enhanced Instruction Set" 属性(或任何一个选项将为您提供代码)与您的目标 PC 兼容)。
编译器使用 vmovq
意味着您(至少)启用了 "Advanced Vector Extensions";另外,我认为(不是 100% 确定)vcvttpd2qq
属于 "AVX2" 类别。
这是 Visual Studio 的 16.3.x 更新中的错误。这里是 link 到 bug report.
仔细阅读,它实际上发生在支持 AVX512 的机器上,而不是最初 post 描述的旧 CPU。在 Microsoft 修复之前,这还包含一些解决方法来避免此问题。
我有一个代码可以运行多年的服务。
现在使用 VS-2019 16.3.7/8/9 我得到 0xC000001D(线程试图执行无效指令。)在某些机器上服务启动阶段的第一个浮点算法异常.
安装使用 16.2.4/5 编译的相同代码库。
我有一台机器的完整内存故障转储。崩溃发生在调用 _dtol3
.
我在汇编代码中可以看到这种情况。
0149477B 83 3D B4 AC 55 01 06 cmp dword ptr [__isa_available (0155ACB4h)],6
01494782 7C 15 jl _dtol3_default (01494799h)
01494784 C5 FA 7E C0 vmovq xmm0,xmm0
01494788 62 F1 FD 08 7A C0 vcvttpd2qq xmm0,xmm0 <---- CRASH
__isa_available
的值为 6。在我的机器上,该值为 5。我们可以看到崩溃的一台机器是 XEON Silver 4110
运行 我们的软件虚拟化。相同的 exe 在 XEON E5-2620
上运行。相同的 exe 在我公司的所有客户端机器上运行没有任何问题(新旧英特尔机器的混合)。
查看调用的代码,我可以看到将它与大于或等于 1.0 的值进行比较时,有一个简单的差异和除法。
COleDateTime nowClient = COleDateTime::GetCurrentTime(),
nowDB = GetCurrentTime();
COleDateTimeSpan diff = nowDB-nowClient;
if (diff.GetTotalMinutes()>=1) // <----- CRASH
...
有没有办法影响VS中的代码创建,避免调用这段代码? (任何垫片、兼容性设置)
自 VS 16.2.4 以来,VS-2019 是否有任何已知的影响浮动数学的变化,这可能会影响我的问题?
您可以在其 "Properties" sheet:
中为每个项目启用或禁用 [=32=] 指令的生成- 在解决方案资源管理器中右键单击项目,然后从弹出菜单中 select "Properties"。
- Select/Open 左侧窗格中的 "C/C++" 选项卡,然后 select "Code Generation" 项。
- 然后在右侧窗格中显示的属性列表中,select "Not Set" 用于 "Enabled Enhanced Instruction Set" 属性(或任何一个选项将为您提供代码)与您的目标 PC 兼容)。
编译器使用 vmovq
意味着您(至少)启用了 "Advanced Vector Extensions";另外,我认为(不是 100% 确定)vcvttpd2qq
属于 "AVX2" 类别。
这是 Visual Studio 的 16.3.x 更新中的错误。这里是 link 到 bug report.
仔细阅读,它实际上发生在支持 AVX512 的机器上,而不是最初 post 描述的旧 CPU。在 Microsoft 修复之前,这还包含一些解决方法来避免此问题。