【发布时间】:2010-08-20 13:35:31
【问题描述】:
我正在尝试让我们的一款旧游戏正常运行,以便我们重新发布它。除了当我最初运行可执行文件时,它还有效,我收到以下错误消息:
"驱动器中没有磁盘。请将磁盘插入驱动器\Device\Harddisk4\DR4"
然后当我点击“取消”或“继续”时,它会继续加载游戏并正常工作。
所以我将 exe 加载到反汇编程序中,结果是在尝试加载 granny2.dll 的符号时。这是调用堆栈:
callstack image http://www.dracan.co.uk/temp/grannybugcallstack.png
所以它试图从我没有的驱动器/目录中加载 granny2.pdb(它将成为 Granny 3D 库的一部分)。
在我们的游戏目录中,有 granny2.dll。所以我通过 Visual Studio 的 dumpbin 实用程序运行它,并在其中引用了该路径:
Debug Directories
Time Type Size RVA Pointer
-------- ------ -------- -------- --------
40493D28 cv 37 00000000 5A400 Format: NB10, 3FF4AC61, 32, h:\build\granny\release\rt\granny2.pdb
我从各种在线资源中获取了这个 DLL 的几个版本,它们似乎都在 DLL 中具有相同的 PDB 路径。
任何人都可以想办法绕过这个错误消息吗?
我正在运行 Windows7。一位同事正在运行 Vista,并且刚刚开始看到它,但上周运行它而没有收到错误。不幸的是,他想不出从那以后他的电脑发生了什么变化。另一位正在运行 XP 的同事根本没有收到此错误
感谢您对此的任何帮助,
丹。
【问题讨论】:
-
我不明白。该调用堆栈全部与调试帮助库有关;这只是在调试时发生吗?
-
不,它也发生在调试器之外。我只是将它加载到反汇编程序中,以找出代码调用了什么来导致该消息框出现。一旦该消息框出现,我在反汇编程序中点击暂停,这就是它给我的调用堆栈。也许这是一条红鲱鱼 - 但它在调试器内外都是相同的错误消息。
-
所以游戏本身正在尝试加载自己的调试符号?对我来说听起来有点奇怪。执行此操作的代码是什么 - 游戏本身还是 Granny 3D 库?
-
我假设游戏正在尝试加载 DLL 的调试符号。虽然我不确定为什么 DLL 和我们的游戏都是非调试编译的。不幸的是,我们游戏的 Exe 是几年前编译的(我没有参与其中)。
-
那么 SymInitialize 是从哪里调用的呢?堆栈回退得不够远。你有游戏的源代码吗?如果是这样,您可以使用 SetErrorMode 并希望这会摆脱对话框。不过,我仍然认为有人试图加载符号是相当奇怪的。