C++ 调试:MSVCP140D.dll 不是针对 Windows 上的 运行 而设计的

C++ debugging: MSVCP140D.dll is either not designed to run on Windows

我正在尝试调试我在 Visual Studio 2017 Professional 中获取源代码的 C++ 程序。我可以在 "Release x64" 配置中构建应用程序并且它执行得很好。

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

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

C:\WINDOWS\SYSTEM32\MSVCP140D.dll is either not designed to run on Windows or it contains an error. Try installing the program again using the original installation media or contact your system administrator or the software vendor for support. Error status 0xc000012f.

据我所知,"MSVCP140D" 代表 dll 的 "Microsoft Visual C++ v140 Debug" 版本。 dll 并没有丢失,事实上我的机器上有 6 个位置:

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

据说 "Desktop development with C++" 工作负载由 VS Installer(声称自己是最新版本 1.18.1100.314)完全安装。我通常用 C# 编程,所以我不熟悉项目设置交互的方式,我注意到了一些事情,但我不确定是否有任何事情与我的问题有关:

  1. 平台工具集是"Visual Studio 2017 (v141)"。
  2. 唯一包含看起来像上述 4 个 "redist" 路径之一的路径的宏是 $(DebugCppRuntimeFilesPath) 宏,它不属于 "VC++ directories" 中的任何条目设置。
  3. 当 dll 位于“...\14.16.27012\...”时,$(DebugCppRuntimeFilesPath) 宏的计算结果为 "C:\Program Files (x86)\Microsoft Visual Studio17\Professional\VC\Redist\MSVC.16.27023\debug_nonredist\x64"。目录“14.16.27023”不存在。

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

更新: 我现在还尝试下载 VS 2019 安装程序(版本 2.0.3297.403),看看它是否为 VC++ 工作负载提供任何更新,但显然不是。

Hans Passant 提示错误代码表示C:\Windows\System32\中的dll文件被破坏

我检查确实 System32 中的 dll(981,552 字节,无符号,仅填充了文件属性详细信息选项卡上的一些条目)与 VS 分发的 dll(981,744 字节,有符号,完整信息)不同在文件属性详细信息选项卡上)。因此,我决定通过将 System32 中的当前 "msvcp140d.dll" 重命名为 "msvcp140d_orig.dll" 并将 C:\Program Files (x86)\Microsoft Visual Studio17\Professional\VC\Redist\MSVC.16.27012\debug_nonredist\x64\Microsoft.VC141.DebugCRT\ 中的

复制过来。

现在可以调试了。

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