4

我们将一个应用程序从 Delphi 7 移植到 Delphi 2010,并让客户在 Windows XP 下运行时遇到间歇性 BSOD(蓝屏死机)错误。这些错误非常零星,很难追查。仅供参考:我们使用的是 Delphi 2010 的内置内存管理器。

我们首先想到的是硬件问题,但升级系统驱动程序未能解决问题。

有没有其他人在 XP 下使用 Delphi 2010 生成的应用程序遇到 BSOD 问题?如果是这样,您对我们如何解决这个问题有什么建议吗?

感谢你的协助!

4

2 回答 2

6

Delphi 核心库中没有任何内容可以直接导致蓝屏死机。正如大卫所指出的,Delphi 程序在用户空间中运行。但是,如果他们将无效数据发送到内核空间驱动程序,那就另当别论了。

你说的是 D7-D2010 更新,我首先想到的是字符串改造。Delphi 的标准字符串类型已从AnsiString(每个字符 1 个字节)更改为(每个字符UnicodeString2 个字节),如果您将错误类型的字符串发送到某个地方的驱动程序或系统例程,则可能会导致奇怪的行为。

我要做的第一件事是运行一个完整的构建并观察来自编译器的“隐式转换”警告。这意味着您正在混合字符串类型。找到这些并修复它们,看看是否有帮助。

此外,如果您有任何外部库的导入单元,并且它们使用带有字符串(或更可能是PChar)参数的 API,请确保将它们转换为PAnsiChar. Delphi 已经为 中使用的 Windows API 处理了这一点windows.pas,但是如果您有任何自己的东西,则需要自己处理。

于 2011-07-11T20:23:38.220 回答
3

可以使用WinDbg或其他能够处理故障转储的工具打开故障转储来分析 BSOD 。即使是“小型转储”也会提供足够的信息来尝试了解 BSDO 发生的位置和原因。WinDbg 可以免费下载,您不需要在目标机器上安装它,您可以要求您的客户将故障转储发送给您,您可以离线分析它们。无论如何,从用户模式代码生成 BSOD 通常是非常困难的 - 但是有一些方法可以使系统崩溃。BSOD 显示什么样的错误?

更新:如果错误是 PAGE_FAULT_IN_NONPAGED_AREA 这个链接解释了发生了什么:http ://technet.microsoft.com/en-us/library/cc957625.aspx 。这通常是与内存有关的问题,并且可能是D2010使用比旧版本更多的内存最终可能会触发它。你能在这些机器上运行 memtest (http://www.memtest.org/) 吗?

Ntkrlnpa.exe 不是驱动程序,是包含操作系统执行程序和内核代码的映像(支持 PAE 的版本)。使用 winDbg 和故障转储可以获得导致崩溃的调用堆栈。

于 2011-07-11T20:41:25.247 回答