在Win10上用VS2015编译的C++ SDL2程序调试加载时间错误
Debugging load time error in C++ SDL2 program compiled with VS2015 on Win10
我正在使用 Visual Studio 2015 在 64 位 Windows 10 上使用 SDL2 在 C++ 中编写一个项目。我最近购买了一台新的 Windows 10 笔记本电脑并从中克隆了我的项目github。我的项目编译正确,但是当我 运行 它时出现以下错误:
The application was unable to start correctly (0xc000007b). Click OK to close the application.
根据我目前的研究,这个错误通常是由加载不兼容的 DLL 引起的,例如64 位版本而不是 32 位版本。目前我发现的建议包括:
- 检查我使用的是 32 位版本的 SDL2 DLL
- Installing/reinstalling Visual Studio 2015
的 x86 版 Visual C++ Redistributable
- 使用 Dependency Walker 排除故障的 DLL
我的项目设置为为 Win32 构建,并且我确保我使用的是我明确链接的所有 DLL 的 32 位版本(libfreetype-6、libpng16-16、SDL2、SDL2_image、SDL2_mixer 和 SDL2_ttf)。我已经确认我的机器上安装了 x86 VC++ Redistributable。
最后,我尝试使用 Dependency Walker 来确定可能导致问题的 DLL(尽管我已经阅读了 Dependency Walker 有很多误报的警告)。这些是结果:
Dependency Walker 静态分析
Dependency Walker 分析结果
在那之后,探查器会冻结并且永远不会继续。请注意,SDL 组件和 VC 运行 时间加载没有错误。
程序在我的两台旧机器上正确编译和加载,一台 运行ning 32 位 Windows 7 和一台 运行ning 64 位 Windows 10 .
现在开始真正的问题。我还可以采取哪些其他步骤来调试此崩溃?或者有人从我提供的信息中看出我做错了什么吗?
相关问题:
- The application was unable to start correctly (0xc000007b)
- Win 7, 64 bit, dll problems
- Using SDL_image in Visual studio 2010, with error "application was unable to start correctly 0xc000007b"
编辑:
正如 rflobao 所建议的,我在 32 位 exe 上使用 64 位版本的 Dependency Walker。这是我的分析的新输出 运行:
此时,和以前一样,Dependency Walker 冻结了。我仍然完全迷失了方向,感觉自己离确定问题的原因还差得很远。
请注意,Dependency Walker 有 32 位和 64 位版本。如果您的应用程序是 32 位的,您应该使用 32 位版本。否则 Dependency Walker 将看到 System32 而不是 SisWOW64 的库。
您的图像显示混合了 32 位和 64 位库,其中 64 位有错误。
这绝不是完全可靠的,但你可以试一试。它需要 dumpbin.exe,它包含在 Visual Studio.
中
首先,获取程序的依赖 DLL 列表,根据您的路径解析:
del dlls.txt
for /f %d in ('dumpbin /dependents Questless.exe ^| findstr /ic:".dll"') do @echo %~$PATH:d >> dlls.txt
然后获取每个的位数:
for /f "delims=" %d in (dlls.txt) do @echo %d & dumpbin /headers "%d" | findstr /c:"machine (x"
这将产生如下输出:
C:\Windows\System32\kernel32.dll
8664 machine (x64)
C:\programs\ed23\bin\hydra.dll
14C machine (x86)
请注意,这是错误地使用了 System32 中的 kernel32.dll,而不是 WOW6432 中的 kernel32.dll,因此它显示为 x64。那是因为它只是使用了路径,当 Windows 加载器实际使用 WOW6432 映射器、SxS、应用程序清单时,只有在其中 none 解决了依赖关系时才回退到路径上。它也找不到依赖项的依赖项(您可以编写脚本通过依赖项递归,但一定要过滤掉重复项),当然对 运行 时间显式动态加载一无所知。
尽管如此,这是获取要检查的简短列表的快速方法,并且可能会发现您的问题。
我觉得自己很笨,但我终于找到了真正的问题所在。我正在使用 SDL 字体库 SDL2_ttf,而我只是没有将 zlib.dll 从 SDL2_ttf lib 目录复制到我的构建目录中。我不明白为什么错误信息如此神秘;在过去,丢失的 DLL 给了我一个有用的 "foo.dll is missing" 错误消息。
无论如何,谢谢大家的帮助。至少我学到了一个有用的教训:在怀疑更复杂的问题之前,始终确保所有必需的 DLL 都存在。
我正在使用 Visual Studio 2015 在 64 位 Windows 10 上使用 SDL2 在 C++ 中编写一个项目。我最近购买了一台新的 Windows 10 笔记本电脑并从中克隆了我的项目github。我的项目编译正确,但是当我 运行 它时出现以下错误:
The application was unable to start correctly (0xc000007b). Click OK to close the application.
根据我目前的研究,这个错误通常是由加载不兼容的 DLL 引起的,例如64 位版本而不是 32 位版本。目前我发现的建议包括:
- 检查我使用的是 32 位版本的 SDL2 DLL
- Installing/reinstalling Visual Studio 2015 的 x86 版 Visual C++ Redistributable
- 使用 Dependency Walker 排除故障的 DLL
我的项目设置为为 Win32 构建,并且我确保我使用的是我明确链接的所有 DLL 的 32 位版本(libfreetype-6、libpng16-16、SDL2、SDL2_image、SDL2_mixer 和 SDL2_ttf)。我已经确认我的机器上安装了 x86 VC++ Redistributable。
最后,我尝试使用 Dependency Walker 来确定可能导致问题的 DLL(尽管我已经阅读了 Dependency Walker 有很多误报的警告)。这些是结果:
Dependency Walker 静态分析
Dependency Walker 分析结果
在那之后,探查器会冻结并且永远不会继续。请注意,SDL 组件和 VC 运行 时间加载没有错误。
程序在我的两台旧机器上正确编译和加载,一台 运行ning 32 位 Windows 7 和一台 运行ning 64 位 Windows 10 .
现在开始真正的问题。我还可以采取哪些其他步骤来调试此崩溃?或者有人从我提供的信息中看出我做错了什么吗?
相关问题:
- The application was unable to start correctly (0xc000007b)
- Win 7, 64 bit, dll problems
- Using SDL_image in Visual studio 2010, with error "application was unable to start correctly 0xc000007b"
编辑:
正如 rflobao 所建议的,我在 32 位 exe 上使用 64 位版本的 Dependency Walker。这是我的分析的新输出 运行:
此时,和以前一样,Dependency Walker 冻结了。我仍然完全迷失了方向,感觉自己离确定问题的原因还差得很远。
请注意,Dependency Walker 有 32 位和 64 位版本。如果您的应用程序是 32 位的,您应该使用 32 位版本。否则 Dependency Walker 将看到 System32 而不是 SisWOW64 的库。 您的图像显示混合了 32 位和 64 位库,其中 64 位有错误。
这绝不是完全可靠的,但你可以试一试。它需要 dumpbin.exe,它包含在 Visual Studio.
中首先,获取程序的依赖 DLL 列表,根据您的路径解析:
del dlls.txt
for /f %d in ('dumpbin /dependents Questless.exe ^| findstr /ic:".dll"') do @echo %~$PATH:d >> dlls.txt
然后获取每个的位数:
for /f "delims=" %d in (dlls.txt) do @echo %d & dumpbin /headers "%d" | findstr /c:"machine (x"
这将产生如下输出:
C:\Windows\System32\kernel32.dll 8664 machine (x64) C:\programs\ed23\bin\hydra.dll 14C machine (x86)
请注意,这是错误地使用了 System32 中的 kernel32.dll,而不是 WOW6432 中的 kernel32.dll,因此它显示为 x64。那是因为它只是使用了路径,当 Windows 加载器实际使用 WOW6432 映射器、SxS、应用程序清单时,只有在其中 none 解决了依赖关系时才回退到路径上。它也找不到依赖项的依赖项(您可以编写脚本通过依赖项递归,但一定要过滤掉重复项),当然对 运行 时间显式动态加载一无所知。
尽管如此,这是获取要检查的简短列表的快速方法,并且可能会发现您的问题。
我觉得自己很笨,但我终于找到了真正的问题所在。我正在使用 SDL 字体库 SDL2_ttf,而我只是没有将 zlib.dll 从 SDL2_ttf lib 目录复制到我的构建目录中。我不明白为什么错误信息如此神秘;在过去,丢失的 DLL 给了我一个有用的 "foo.dll is missing" 错误消息。
无论如何,谢谢大家的帮助。至少我学到了一个有用的教训:在怀疑更复杂的问题之前,始终确保所有必需的 DLL 都存在。