我们将Delphi 7的应用程序移植到Delphi 2010,并且客户在Windows XP下运行时遇到间歇性BSOD(蓝屏死机)错误。错误是非常零星的,并且很难追查。仅供参考:我们正在使用Delphi 2010的内置内存管理器。
我们首先想到的是硬件问题,但升级系统驱动程序无法解决问题。
有没有其他人在使用Delphi 2010生成的应用程序的XP下遇到BSOD问题?如果是这样,您对我们如何解决这个问题有任何建议吗?
感谢您的协助!
答案 0 :(得分:6)
Delphi核心库中没有任何东西可以直接导致BSOD。正如David指出的那样,Delphi程序在用户空间中运行。但是,如果他们向内核空间驱动程序发送无效数据,那就不一样了。
你说D7-D2010更新了,我发生的第一件事是字符串改版。 Delphi的标准字符串类型已从AnsiString
(每个字符1个字节)更改为UnicodeString
(每个字符2个字节),如果您将错误类型的字符串发送到某个地方的驱动程序或系统例程可能会引起奇怪的行为。
我要做的第一件事是运行完整版本并观察编译器的“隐式转换”警告。这意味着您正在混合字符串类型。找到这些并修复它们,看看是否有帮助。
此外,如果您有外部库的任何导入单元,并且他们使用带有字符串(或更可能是PChar
)参数的API,请确保它们已转换为PAnsiChar
。 Delphi已经为windows.pas
中使用的Windows API内容处理了这个问题,但是如果你有自己的任何东西,你需要自己处理它。
答案 1 :(得分:3)
可以使用WinDbg或其他能够处理故障转储的工具分析崩溃转储的BSOD。即使是“minidump”也会提供足够的信息来试图了解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和崩溃转储,可能会获得导致崩溃的调用堆栈。