【问题标题】:C++ debugging: MSVCP140D.dll is either not designed to run on WindowsC++ 调试:MSVCP140D.dll 不是为在 Windows 上运行而设计的
【发布时间】:2019-05-14 12:32:27
【问题描述】:

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

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

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

C:\WINDOWS\SYSTEM32\MSVCP140D.dll 不是为在 Windows 上运行而设计的,或者它包含错误。尝试使用原始安装介质重新安装程序,或联系您的系统管理员或软件供应商寻求支持。错误状态0xc000012f。

据我所知,“MSVCP140D”代表 dll 的“Microsoft Visual C++ v140 Debug”版本。 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

据说“使用 C++ 进行桌面开发”工作负载完全由 VS Installer 安装(它声称自己是最新的版本 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.27023\debug_nonredist\x64” ,当 dll 在“...\14.16.27012\...”中时。目录“14.16.27023”不存在。

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

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

【问题讨论】:

  • 0xC000012F 非常讨厌,告诉您 c:\window\system32\msvcp140.dll 已损坏,操作系统无法再将其识别为可执行文件。您最好检查一下您的磁盘是否损坏,至少运行 chkdsk.exe。您有一个备份副本。
  • @HansPassant chkdsk 在整个 C: 卷中没有发现错误。此外,我的问题与调试版本(140d)有关,但我想这只是你的错字。
  • @HansPassant 我能够通过将System32 中的文件替换为随VS 分发的文件来解决此问题。我不确定VS应该首先使用System32中的那个而不是它自己的,但这仍然解决了这个问题。你想回答我可以接受,还是应该?

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


【解决方案1】:

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 Studio\2017\Professional\VC\Redist\MSVC\14.16.27012\debug_nonredist\x64\Microsoft.VC141.DebugCRT\ 复制一个来替换当前的“msvcp140d.dll”。

现在可以调试了。

我不是 100% 相信 VS 应该使用 那个 文件,而不是首先与工作负载一起分发的文件,但至少我的问题得到了解决,我可以调试代码。 p>

【讨论】:

  • 您的问题似乎已通过此解决方法解决,请考虑将检查作为您问题的“已接受答案”。 ;)
  • 是的,我会的,但我想我只能在 24 小时后接受我自己的答案(上面写着“明天”)。
猜你喜欢
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2014-02-21
  • 1970-01-01
相关资源
最近更新 更多