Delphi 2010 BSOD错误

Delphi 2010 BSOD错误,delphi,delphi-2010,bsod,Delphi,Delphi 2010,Bsod,我们将一个应用程序从Delphi 7移植到Delphi 2010,有客户在Windows XP下运行时遇到间歇性BSOD(蓝屏死亡)错误。这些错误非常零散,很难追踪。仅供参考:我们正在使用Delphi2010的内置内存管理器 我们首先想到的是硬件问题,但升级系统驱动程序未能解决问题 是否有其他人在使用Delphi 2010生成的应用程序时遇到XP下的BSOD问题?如果是这样,您对我们如何纠正此问题有何建议 谢谢你的帮助 Delphi核心库中没有任何东西可以直接导致BSOD。正如David指出的,

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

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

是否有其他人在使用Delphi 2010生成的应用程序时遇到XP下的BSOD问题?如果是这样,您对我们如何纠正此问题有何建议


谢谢你的帮助

Delphi核心库中没有任何东西可以直接导致BSOD。正如David指出的,Delphi程序在用户空间中运行。但是,如果他们向内核空间驱动程序发送无效数据,那就不同了

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

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


此外,如果您有任何外部库的导入单元,并且它们使用的API带有字符串(或者更可能是
PChar
)参数,请确保它们已转换为
PAnsiChar
。Delphi已经为Windows.pas中使用的Windows API解决了这个问题,但是如果你有自己的API,你需要自己解决。

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

更新:如果错误是非页面区域中的页面错误,则此链接解释发生的情况:。这通常是一个与内存相关的问题,可能是D2010使用了比旧版本更多的内存,最终触发了它。你能在那些机器上运行memtest吗(http://www.memtest.org/)?


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

我看到Delphi的内存管理和Windows中的DEP出现问题,导致许多奇怪的操作系统错误。设置/noexecute=AlwaysOF或为应用程序添加异常可缓解此问题。问题在于设备驱动程序或硬件。Delphi应用程序在用户空间中运行,不会导致内核故障。@Gordy:什么版本?Delphi的最后几个版本附带了FastMM内存管理器,它修复了Borland MM中的正确性问题。XP机器安装了什么service pack?@Mason Wheeler:D2007,切换DEP和测试可能值得OP花上几分钟时间,尽管听起来这个问题并不总是可以重现的。+1-它仍然指向内核级/驱动程序错误。发送无效数据不应导致BSOD,故障应过滤回用户应用程序。另外(对于OP):如果这样做,请确保仔细检查所有装置(和第三方组件),以确保它们没有隐藏警告!我曾经见过一个用户模式应用程序在多台机器上不断地崩溃NT4——当加载一个损坏的文档文件时,该应用程序是MS Word(95或97)@盖瑞:这是一个语义问题。用户模式代码不能使操作系统崩溃,只有内核模式代码可以。但是用户模式代码肯定可以调用内核模式例程,这可能导致崩溃。@Gerry XP离NT4还有很长的路要走。@David-我知道。我当时只是觉得很奇怪。如果当时有时间和工具来调查,那就太好了。这更像是一个轶事。BSOD错误是由驱动程序ntkrnlpa.exe导致的“非页面区域中的页面错误”。这似乎只发生在Windows XP机器上。他们在SP 3上。我相信所有经历过这个问题的人都是如此,但他们必须进行双重验证。这些工作站运行Delphi7版本很好。只有移植到Delphi2010的版本失败了。我们目前正在研究“隐式转换”警告并解决这些问题(我们没有太多)。然后,我们将继续检查我们的第三方供应商组件。我们进行了内存测试,在内存测试的一个阶段,只有一台机器出现问题。其他人都还好。我们升级了一个组件,解决了所有隐式强制转换(虽然我们没有很多),没有发现任何不正确或可疑的内容。我们将做进一步的测试,并在知道进展后发布。您是否尝试分析转储?它将直接从问题根源为您提供宝贵的信息。好吧,我真的不知道我在看什么,并且我在这里可以包括的内容有限,但使用WinDbg我得到以下信息:页面错误在非页面区域(50),错误IP:win32k!NtGdiModifyWorldTransform+a6。图形问题?这只是Windows XP下的一个问题,请注意,您和Delphi 7版本的相同代码没有问题。我们自己不做任何图形编程。有什么想法吗?