C++ DX11 应用仅在 Visual Studio IDE 中运行

5

好的,我在MSDN论坛上提出了这个问题,但还没有得到任何回应,所以我想试试StackOverflow。

我目前正在使用VS2008和Win7开发DirectX应用程序。最近,我遇到了一个很严重的内存损坏错误,这个内存分配类抓取字节对齐的内存。在这个错误期间,我仍然可以运行调试和发布可执行文件,但由于指令被破坏或其他原因而崩溃,但它仍然会在崩溃之前执行一段时间。

然后我剥离了整个内存分配类。应用程序在IDE中完美运行(发布和调试版本),但我无法运行任何可执行文件。它们立即崩溃并显示未响应/停止工作的错误。我不认为这是我的环境问题,因为我在另一台之前没有问题的计算机上也遇到了同样的问题。

Dependency walker给出了“警告:至少找不到一个延迟加载依赖模块。警告:至少有一个模块由于延迟加载依赖模块中缺少导出函数而具有未解决的导入。”错误,并指出无法找到GPSVC.dll和IESHIMS.DLL。我已经读到这可能会误导,只是表示可能存在问题。而且Dependency walker在前一天并没有给我这个错误。

我没有修改任何配置或项目设置或添加新代码。有什么想法可以解决这种行为?

还有一个注意事项,我在同一天安装了Windows 7.1 sdk。这可能是某种与编译器相关的错误吗?

以防MSDN帖子上出现一些有用的信息,这里是链接http://social.msdn.microsoft.com/Forums/en-IE/vsdebug/thread/f692b394-8af2-4453-991c-aa6a443a9019

谢谢!

编辑 -

这里是Dependency Walker分析输出的最后几行

GetProcAddress(0x76CD0000 [c:\ windows \ syswow64 \ KERNEL32.DLL],“DecodePointer”)从地址0x6D8BAE4F在“c:\ windows \ syswow64 \ NVWGF2UM.DLL”中调用,并返回0x77B59D65。 GetProcAddress(0x76CD0000 [c:\ windows \ syswow64 \ KERNEL32.DLL],“DecodePointer”)从地址0x6D8BAE4F在“c:\ windows \ syswow64 \ NVWGF2UM.DLL”中调用,并返回0x77B59D65。 GetProcAddress(0x76CD0000 [c:\ windows \ syswow64 \ KERNEL32.DLL],“EncodePointer”)从地址0x6D8BAF60在“c:\ windows \ syswow64 \ NVWGF2UM.DLL”中调用,并返回0x77B60FDB。 GetProcAddress(0x76CD0000 [c:\ windows \ syswow64 \ KERNEL32.DLL],“DecodePointer”)从地址0x6D8BAF70在“c:\ windows \ syswow64 \ NVWGF2UM.DLL”中调用,并返回0x77B59D65。 在地址0x0110152E处发生了第二次机会异常0xC0000005(访问冲突),位于“c:\ users \ joel \ desktop \ DXAPP.EXE”中。使用代码255(0xFF)退出了“c:\ users \ joel \ desktop \ DXAPP.EXE”(进程0x27D8)。

这是指DLL抓取空指针还是我的实际指令?我将快速阅读如何使用WinDbg,如果这没有立即解决问题,我将发布其输出。

编辑2 -

简单地运行应用程序并按调试以打开Visual Studio始终将我带到编译着色器的位置。我暂时认为问题的根源在于此。但是,我仍然不理解在使用IDE和不使用时执行之间的行为变化。

解决方案! -

我被先前的内存损坏错误所困扰,以至于我没有意识到我的着色器不在可执行文件的本地目录中。这反过来生成了一个空指针,在调用D3DX11CompileFromFile()后未正确处理。


获取依赖项查看器,确保它能够看到你所需的所有 DLL。 - Martin York
是的,我做了,看看第四段。另外没有添加新的库或DLL。 - Joel
我怀疑你的应用程序不需要gpsvc.dll或ieshims.dll。如果你不能在能够从IDE运行它们的同一台机器上运行输出可执行文件,那么你的编译器和链接器命令行可能有一些见解。能否在此发布? - AJG85
哦,顺便说一下...你的机器上安装了DirectX运行时吗? - AJG85
你能找出在应用程序崩溃之前它“执行”到了哪个点吗?如果它在“你的”任何代码执行之前崩溃,那肯定与代码如何加载以及相关的dll被带入内存有关。 - Jaywalker
是的,我绝对不需要那些DLL。 我在我的项目中只使用DX11和Win32库。 当涉及到编译和链接的许多复杂性时,我也非常缺乏经验,所以这非常令人沮丧(但有教育意义!)。现在我想起来了,我猜一些代码确实会执行,因为Win32窗口至少弹出来了,尽管是空白的。是的,我安装了DirectX运行时。 如果只是这个问题就好了! - Joel
1个回答

0

真是抱歉,我本来想发出评论的...

我只能建议您尝试更多的诊断方法。

其中之一是在Depends中对应用程序进行剖析,这也将显示动态DLL加载,并可能显示新内容。它还捕获调试输出。它可能与在调试器中启动有所不同,提供了一个线索。您没有提到实际剖析,因此我想建议您尝试一下。此外,请非常注意加载的DLL路径 - 可能会有DLL从您意图之外的位置加载。

另一个建议是,在崩溃后(在关闭错误对话框之前)尝试附加到停止的应用程序。看看是否可以得到堆栈跟踪或其他任何信息。

最后,请尝试使用WindDbg进行附加(甚至从中启动),而不是使用IDE。像取决于配置文件一样,调试器行为和其如何挂钩应用程序的差异可能导致崩溃发生,同时提供您所需的线索。

祝你好运!


谢谢!我会研究所有这些选项。我对性能分析软件或DLL没有任何经验。目前,我的项目只引用了DX11和win32库。 - Joel
嗯,Depends所谓的“分析”并不是通常意义上的性能分析。当Depends进行分析时,它只是执行应用程序并跟踪每个DLL的加载情况。因此,它可以捕获按需加载的DLL以及通常获取的静态DLL依赖项。但是,您可以查看所有路径,并轻松查看是否从旧安装、错误路径等加载了旧DLL。此外,只需打开调试输出即可给您提供线索。 - PhysicalEd
添加了一些依赖项检查器的输出。在遇到空指针之前,没有看到任何明显的问题。是一个DLL生成并处理了空指针还是我的程序?明天有机会玩一下WinDbg并发布输出。 - Joel
在我看来,异常是发生在你的可执行文件中而不是 DLL 中。为了更加确定,在 Windows 7 崩溃报告对话框中,查看“更多详细信息”,它应该告诉你异常发生的模块,无论是 exe 还是哪个 DLL。 - PhysicalEd
是的!只需点击调试按钮并打开Visual Studio,我就能一致地到达编译着色器的位置(为什么我以前从未这样做过!),因此我认为我已经找到了问题的根源。然而,我仍然不理解使用IDE执行应用程序和不使用时行为差异的区别。 - Joel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接