C ++调试:MSVCP140D.dll并非旨在在Windows上运行

时间:2019-05-14 12:32:27

标签: visual-c++ visual-studio-2017 visual-studio-debugging

我正在尝试调试在Visual Studio 2017 Professional中接管源代码的C ++程序。我可以在“ Release x64”配置中构建应用程序,并且可以正常运行。

即使我在 Release 模式下执行它,它也会注意断点。但是在逐步执行过程中,尽管条件的评估结果为if,但指标仍进入false分支的一行,然后按预期继续在分支后面运行(具有讽刺意味的是,指标假定的那行被执行是一个exit语句,因此它肯定是执行)。我猜有些自动缩进会导致调试符号与源代码不同步。这就是为什么我想刷新符号或在实际的“调试”配置中执行代码。

但是,当我将启动配置切换为“ Debug x64”并尝试运行项目时,它给了我一个“ Bad Image”错误:

  

C:\ WINDOWS \ SYSTEM32 \ MSVCP140D.dll不是为了在Windows上运行而设计的,或者它包含错误。尝试使用原始安装媒体再次安装程序,或与系统管理员或软件供应商联系以获取支持。错误状态为0xc000012f。

据我所知,“ MSVCP140D”代表dll的“ Microsoft Visual C ++ v140调试”版本。该dll并未丢失,实际上我在计算机上的6个位置拥有它:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Redist\MSVC\14.16.27012\debug_nonredist\x64\Microsoft.VC141.DebugCRT\msvcp140d.dll
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Redist\MSVC\14.16.27012\debug_nonredist\x86\Microsoft.VC141.DebugCRT\msvcp140d.dll
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Redist\MSVC\14.16.27012\onecore\debug_nonredist\x64\Microsoft.VC141.DebugCRT\msvcp140d.dll
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Redist\MSVC\14.16.27012\onecore\debug_nonredist\x86\Microsoft.VC141.DebugCRT\msvcp140d.dll
C:\Windows\System32\msvcp140d.dll
C:\Windows\SysWOW64\msvcp140d.dll

据说VS Installer已完全安装了“使用C ++进行桌面开发”的工作负载(它声称自己的最新版本为1.18.1100.314)。我通常使用C#编程,所以我不熟悉项目设置的交互方式,并且注意到了几件事,但是我不确定其中是否与我的问题有关:

  1. 平台工具集为“ Visual Studio 2017( v141 )”。
  2. 唯一包含与上述4个“ redist”路径类似的路径的宏是$(DebugCppRuntimeFilesPath)宏,它不是“ VC ++目录”设置中任何条目的一部分。
  3. $(DebugCppRuntimeFilesPath)宏的计算结果为“ C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Professional \ VC \ Redist \ MSVC \ 14.16.270 23 \ debug_nonredist \ dll位于“ ... \ 14.16.270 12 \ ...”中。目录“ 14.16.270 23 ”不存在。

第3点对我来说似乎是最有希望的提示,但是我不知道更高版本的版本是从哪里来的,在项目或安装中将在何处更改或影响它,等等。

更新:我还尝试立即下载VS 2019安装程序(版本2.0.3297.403),看看是否可以提供VC ++工作负载的任何更新,但显然没有。

1 个答案:

答案 0 :(得分:1)

Hans Passant建议错误代码表示C:\Windows\System32\中的dll文件已损坏。

我检查了System32中的dll(981,552字节,无符号,只有文件属性“详细信息”选项卡上填充的某些条目)确实与VS分发的dll(981,744字节,有符号,完整信息)不同。文件属性详细信息标签)。因此,我决定通过将其重命名为“ msvcp140d_orig.dll”并将其从System32复制过来来替换C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Redist\MSVC\14.16.27012\debug_nonredist\x64\Microsoft.VC141.DebugCRT\中当前的“ msvcp140d.dll”。

现在调试有效。

我不是100%相信VS应该使用那个文件,而不是首先分配工作负载的文件,但是至少我的问题已经解决并且可以调试代码。

>