修复︰ 程序内置 Visual C++ 2013年崩溃,与"非法指令"异常

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 3174417
症状
通过使用 Microsoft Visual C++ 2013年生成程序时,程序将崩溃,并且您收到"非法指令"异常。这是因为 Visual C++ 2013 x64 C 运行时 (CRT) 中的某些浮点数学库函数不正确检查之前尝试使用这些功能是否可用某些 AVX 和 FMA3 指令。说明不是可供使用的如果对这些函数的调用会导致非法指令异常 (0xc000001d)。受影响的函数包括日志、 log10,pow,和其他人。

这个问题是最有可能在以下情况下发生︰
  • 在旧版本的 Windows 操作系统不支持 AVX 状态保存 (例如,Windows Vista) 是否它在支持 AVX 指令集的计算机上使用
  • 如果在操作系统启动配置已显式禁用 AVX 状态保存
  • 在 Windows 预安装环境 (Windows PE)

    注意: Windows PE 不支持 AVX 状态保存。

已在 Microsoft 连接报告了此问题︰

原因
由于 Visual C++ 2013 x64 C 运行时不检查操作系统是否支持 AVX 状态保存,然后尝试运行 AVX 或 FMA3 的指令,将出现此问题。
解决方案
如果所有受影响 c + + 的二进制文件,通过使用 Visual C++ 2013年生成使用 C 运行时 DLL (msvcr120.dll),请安装更新 Microsoft Visual C++ 2013年可再发行组件 – 12.0.40660.0 或更高版本。

如果受影响的 c + + 二进制文件静态链接 Visual C++ 2013 C 运行库,则必须通过安装 3174417 修复和重建并重新部署这些受影响的二进制文件更新安装的 Visual Studio 2013年。

注意此问题不会影响旧版本的 Visual C++ C 运行库 (Visual C++ 2012年及更早版本)。在使用 Visual C++ 到 2015 的通用 crt 的最初发行版本之前修复问题。

Microsoft 下载中心

更新静态链接 Visual C++ 2013 C 运行库,3174417 修补程序发布为仅下载更新,并不通过 Windows Update 分发。它是 Microsoft 下载中心网站︰

下载立即下载该程序包。

更新动态链接 Visual C++ 2013 C 运行时 Dll,更新可再发行组件才可用。有关详细信息,请参阅下面的 Microsoft 知识库文章︰

替代方法
Towork 解决此问题,请禁用 FMA3 中的数学库如果您这个问题的影响。您可以查询系统是否支持通过调用GetEnabledXStateFeatures并通过调用_set_FMA3_enable(0)来显式禁用 AVX CRT 中的 AVX 指令。

有关详细信息,请参阅 使用 XState 上下文 在 MSDN 网站。

_Set_FMA3_enable(0)函数声明中<math.h>,并仅在 x64 生成时,它是可用。(此问题会影响仅 x64 库。)这将导致恢复为使用非 FMA3 实现的数学库。 </math.h>

警告:本文已自动翻译

属性

文章 ID:3174417 - 上次审阅时间:07/29/2016 07:13:00 - 修订版本: 1.0

Visual Studio 2013 Community Edition

  • kbfix kbqfe atdownload kbexpertiseadvanced kbsurveynew kbmt KB3174417 KbMtzh
反馈