Delphi 2010 BSOD错误

4
我们将一个应用程序从Delphi 7迁移到了Delphi 2010,但是在Windows XP下运行时,我们的客户遇到了间歇性的蓝屏死机错误。这些错误非常零散且难以跟踪。值得一提的是:我们使用的是Delphi 2010内置的内存管理器。
我们最初认为这是硬件问题,但升级系统驱动程序未能解决问题。
是否有其他人在XP下使用Delphi 2010生成的应用程序时遇到过BSOD问题?如果是,您有任何建议可以帮助我们解决这个问题吗?
感谢您的帮助!

我曾经见过Delphi的内存管理和Windows中的DEP存在问题,导致出现了许多奇怪的OS错误。设置/noexecute=alwaysoff或为应用程序添加一个异常可以缓解这个问题。 - gordy
7
问题出在设备驱动程序或硬件上。Delphi 应用运行在用户空间,不会引起内核错误。 - David Heffernan
@Gordy:是哪个版本?Delphi的最近几个版本都配备了FastMM内存管理器,它修复了Borland MM中存在的正确性问题。 - Mason Wheeler
XP机器安装了哪个服务包? - user160694
@Mason Wheeler:D2007,切换DEP并进行测试可能值得OP花费几分钟的时间,尽管这似乎不是一个一直能够重现的问题。 - gordy
显示剩余2条评论
2个回答

6
Delphi核心库中没有任何东西可以直接导致蓝屏。正如David所指出的那样,Delphi程序在用户空间运行。但是,如果它们向内核空间驱动程序发送无效数据,那就是另一回事了。
你说的是D7-D2010更新,我想到的第一件事是字符串重构。Delphi的标准字符串类型已从AnsiString(每个字符1字节)更改为UnicodeString(每个字符2字节),如果您向某个驱动程序或系统例程发送错误类型的字符串,则可能会导致奇怪的行为。
我首先要做的是运行完整的构建并查看编译器中的“隐式转换”警告。这意味着您正在混合字符串类型。找到它们并修复它们,看看是否有帮助。
此外,如果您有任何用于外部库的导入单元,并且它们使用需要一个字符串(或更可能是PChar)参数的API,请确保将它们转换为PAnsiChar。对于在windows.pas中使用的Windows API,Delphi已经处理了这个问题,但是如果您有自己的API,则需要自己处理。

6
+1 - 它仍旧指向内核层或驱动程序的错误。发送无效数据不应该导致蓝屏死机,故障应该被过滤并反馈给用户应用程序。此外(对于发起帖子的人):如果你这么做,请确保你双重检查所有的单位(和第三方组件),以确保他们没有隐藏警告! - afrazier
1
我曾经看到一个用户模式应用程序在多台机器上一直崩溃NT4 - 而且当加载损坏的文档文件时,该应用程序是MS Word(95或97)! - Gerry Coll
@Gerry:这是一个语义问题。用户模式代码无法使操作系统崩溃,只有内核模式代码可以。但是用户模式代码肯定可以执行调用内核模式例程的操作,从而导致崩溃。 - Mason Wheeler
@Gerry XP距离NT4还有很长的路要走。 - David Heffernan
@David - 我知道。当时我只是觉得很奇怪。如果当时有时间和工具去调查就好了。这只是一个轶事而已。 - Gerry Coll
显示剩余2条评论

3
BSOD可以通过使用WinDbg或其他能够处理崩溃转储的工具来进行分析。即使是“minidump”也足以提供足够的信息来尝试理解BSOD发生的位置和原因。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和崩溃转储可以获取导致崩溃的调用堆栈。


BSOD错误是“PAGE_FAULT_IN_NONPAGED_AREA”,由驱动程序ntkrnlpa.exe引起。它似乎只会在Windows XP机器上出现。它们都在SP 3上。我认为所有遇到这个问题的机器都是如此,但需要再次验证。这些相同的工作站可以很好地运行Delphi 7版本。只有移植到Delphi 2010的版本失败了。我们目前正在研究“隐式转换”警告并解决这些问题(我们没有太多)。然后我们将继续检查我们的第三方供应商组件。 - user840722
我们进行了内存测试,只有一台机器在内存测试的一个阶段出现了问题。其他所有机器都正常。我们已经升级了其中一个组件,并解决了所有隐式转换(虽然我们没有太多),并且没有发现任何看起来不正确或可疑的情况。我们将进行进一步的测试,并在进展明确后发布我们的进展。 - Jeff Cope
你尝试过分析转储文件吗?它会直接从问题根源给你提供宝贵的信息。 - user160694
好的,我真的不知道我在看什么,而且我能够包含的内容有限,但是使用WinDbg,我得到了以下信息:PAGE_FAULT_IN_NONPAGED_AREA(50),FAULTING_IP:win32k!NtGdiModifyWorldTransform+a6。图形问题?请注意,这只是在Windows XP下出现问题,而Delphi 7版本的相同代码没有问题。我们不会自己进行任何图形编程。有什么想法吗? - Jeff Cope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接