【问题标题】:C++ DX11 application only runs in Visual Studio IDEC++ DX11 应用程序仅在 Visual Studio IDE 中运行
【发布时间】:2011-06-23 15:42:20
【问题描述】:

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

我目前正在 Win7 上使用 VS2008 开发 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。 第二次机会异常 0xC0000005(访问冲突)发生在地址 0x0110152E 的“c:\users\joel\desktop\DXAPP.EXE”中。 退出“c:\users\joel\desktop\DXAPP.EXE”(进程 0x27D8),代码为 255 (0xFF)。

这是指获取空指针的 DLL 还是我的实际指令?将阅读如何真正快速使用 WinDbg,如果这不能立即解决问题,我将发布它的输出。

编辑 2 -

只需运行应用程序并点击调试以调出 Visual Studio,我就一直在编译着色器。我目前假设问题的根源在于这一点。但是,我仍然不明白使用 IDE 和不使用 IDE 在执行过程中的行为变化。

解决方案! -

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

【问题讨论】:

  • 获取依赖walker,确保它可以看到你需要的所有dll。
  • 是的,请查看第 4 段。也没有添加新的库或 DLL。
  • 我怀疑您的应用程序中需要 gpsvc.dll 或 ieshims.dll。如果您无法在可以从 IDE 运行它们的同一台机器上运行输出可执行文件,那么您的编译器和链接器命令行可能会有所了解。愿意在这里发布吗?
  • 哦,很明显......你的机器上确实安装了 DirectX 运行时,对吗?
  • 您能否找出您的应用程序在 IDE 外崩溃之前“执行”到什么时候?如果它在任何“你的”代码执行之前崩溃,那么它肯定与代码的加载方式和依赖的 dll 被带入内存有关。

标签: c++ visual-studio crash


【解决方案1】:

Shoot,对不起,我是想把它作为评论发布......

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

一种方法是从 Depends 中分析应用程序,这也将显示动态 DLL 加载并可能显示一些新内容。它还捕获调试输出。它的行为可能不同于在调试器本身中启动并提供线索。你没有提到实际的分析,所以我想我会建议你这样做,以防你没有。此外,请密切注意加载 DLL 的路径 - 您可能会对从非预期位置加载 DLL 感到惊讶。

另一个建议是尝试在崩溃后附加到停止的应用程序(在关闭错误对话框之前)。看看你能不能得到一个堆栈跟踪或任何东西。

最后尝试附加(甚至从)WindDbg 而不是 IDE。与 Depends 配置文件一样,调试器行为的差异以及它如何挂钩应用程序可能会导致崩溃发生,同时提供您需要的线索。

祝你好运!

【讨论】:

  • 谢谢!将研究所有这些选项。对分析软件或 DLL 没有任何经验。我的项目目前只引用了 DX11 和 win32 库。
  • 好吧,Depends 所称的分析并不是真正意义上的性能分析,因为通常使用该术语。 Depends 在配置文件时所做的只是执行应用程序并在加载时跟踪每个 DLL。因此它可以捕获按需加载的 DLL 以及您通常获得的静态 DLL 依赖项。但是您可以查看所有路径,并轻松查看是否从旧安装中加载了旧 DLL、路径错误等。此外,只需打开调试输出即可为您提供线索。
  • 添加了一些依赖walker的输出。在它被空指针炸毁之前,不要看到任何明显错误的东西。 DLL 是生成和处理空指针还是我的程序?明天有机会去玩WinDbg并发布输出。
  • 在我看来,异常发生在您的可执行文件而不是 DLL 中。更确定的是,在 Windows 7 崩溃报告对话框中,查看“更多详细信息”,它应该会告诉您发生异常的模块,无论是 exe 还是哪个 DLL。
  • 是的!只需点击调试按钮并调出 Visual Studio,我就一直在编译我的着色器(为什么我从来没有这样做过!)所以我假设我已经找到了问题根源所在的区域。但是,我仍然不明白使用 IDE 执行应用程序与不使用 IDE 之间的行为差​​异。
猜你喜欢
  • 2012-07-04
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
相关资源
最近更新 更多