【问题标题】:Delphi 2010 BSOD ErrorsDelphi 2010 蓝屏错误
【发布时间】:2011-07-11 20:02:31
【问题描述】:

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

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

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

感谢您的帮助!

【问题讨论】:

  • 我在 Windows 中看到了 Delphi 的内存管理和 DEP 问题,这些问题导致了许多奇怪的操作系统错误。设置 /noexecute=alwaysoff 或为应用添加例外可缓解此问题。
  • 问题出在设备驱动程序或硬件上。 Delphi 应用程序在用户空间运行,不会导致内核错误。
  • @Gordy:什么版本? Delphi 的最后几个版本带有 FastMM 内存管理器,它修复了 Borland MM 中的正确性问题。
  • XP机器安装了什么服务包?
  • @Mason Wheeler:D2007,切换 DEP 和测试可能值得 OP 花费几分钟,尽管听起来这个问题并不总是可重现的。

标签: delphi delphi-2010 bsod


【解决方案1】:

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

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

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

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

【讨论】:

  • +1 - 它仍然指向内核级/驱动程序错误。发送无效数据不应导致 BSOD,故障应过滤回用户应用程序。另外(对于 OP):如果您这样做,请确保仔细检查您的所有单位(和第 3 方组件),以确保它们没有隐藏警告!
  • 过去我曾看到一个用户模式应用程序在多台机器上持续崩溃 NT4 - 加载损坏的 doc 文件时应用程序是 MS Word(95 或 97)!
  • @Gerry:这是一个语义问题。用户模式代码不能使操作系统崩溃,只有内核模式代码可以。但是用户模式代码肯定可以做一些调用内核模式例程的事情,这可能会导致崩溃。
  • @Gerry XP 与 NT4 相差甚远。
  • @David - 我知道。我当时只是觉得这很奇怪。那时有时间和工具来调查它会很好。这更像是一个轶事。
【解决方案2】:

可以使用WinDbg 或其他能够处理故障转储的工具打开故障转储来分析蓝屏死机。即使是“小型转储”也会提供足够的信息来尝试了解 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 和故障转储可以获得导致崩溃的调用堆栈。

【讨论】:

  • 蓝屏错误是驱动ntkrnlpa.exe引起的“PAGE_FAULT_IN_NONPAGED_AREA”。它似乎只发生在 Windows XP 机器上。他们在 SP 3 上。我相信所有经历过此问题但必须双重验证的人都是如此。这些相同的工作站运行 Delphi 7 版本就好了。只有移植到 Delphi 2010 的版本失败。我们目前正在研究“隐式转换”警告并解决这些问题(我们没有很多)。然后我们将继续检查我们的第 3 方供应商组件。
  • 我们进行了内存测试,只有一台机器在内存测试的一个阶段出现问题。所有其他人都很好。我们升级了我们的一个组件并解决了我们所有的隐式转换(虽然我们没有很多)并且没有发现任何看起来不正确或可疑的。我们将进行进一步的测试并在得知进展后发布我们的进展。
  • 您是否尝试分析转储?它将直接从问题根源为您提供宝贵的信息。
  • 好吧,我真的不知道我在看什么,我在这里可以包含的内容有限,但是使用 WinDbg 我得到以下信息:PAGE_FAULT_IN_NONPAGED_AREA (50), FAULTING_IP: win32k! NtGdiModifyWorldTransform+a6.显卡问题?这只是Windows XP下的问题,请注意与Delphi 7版本相同的代码没有问题。我们自己不做任何图形编程。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多