我们将一个应用程序从Delphi 7移植到了Delphi 2010,在Windows XP下运行时,客户遇到了间歇性的BSOD (蓝屏死亡)错误。这些错误是非常零星的,很难追踪到。仅供参考:我们使用的是Delphi2010的内置内存管理器。
我们首先想到的是硬件问题,但是升级系统驱动程序并没有解决这个问题。
是否有人在使用Delphi 2010生成的应用程序时遇到过XP下的BSOD问题?如果是这样,您对我们如何纠正这个问题有什么建议吗?
感谢您的帮助!
发布于 2011-07-12 04:23:38
在Delphi核心库中,没有任何东西可以直接导致BSOD。正如David指出的,Delphi程序在用户空间中运行。但是,如果它们将无效数据发送到内核空间驱动程序,那就是另一回事了。
你说D7-D2010更新,我想到的第一件事就是字符串的修改。Delphi的标准字符串类型已经从AnsiString (每个字符1个字节)更改为UnicodeString (每个字符2个字节),如果您将错误类型的字符串发送到某个驱动程序或系统例程,可能会导致奇怪的行为。
我要做的第一件事是运行一个完整的构建,并观察来自编译器的“隐式转换”警告。这意味着你混合了字符串类型。找到这些并修复它们,看看这是否有帮助。
此外,如果您有任何用于外部库的导入单元,并且它们使用接受字符串(或者更可能是PChar)参数的API,请确保将它们转换为PAnsiChar。Delphi已经为windows.pas中使用的Windows API解决了这个问题,但是如果你有自己的Windows API,你需要自己处理它。
发布于 2011-07-12 04:41:25
可以使用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和崩溃转储可以获得导致崩溃的调用堆栈。
https://stackoverflow.com/questions/6655825
复制相似问题