Ошибки BSOD Delphi 2010 - PullRequest
       8

Ошибки BSOD Delphi 2010

4 голосов
/ 12 июля 2011

Мы перенесли приложение из Delphi 7 в Delphi 2010, и у нас были клиенты, которые периодически сталкивались с ошибками BSOD (синий экран смерти) во время работы под Windows XP.Ошибки очень спорадические и их очень трудно отследить.К вашему сведению: мы используем встроенный менеджер памяти из Delphi 2010.

Нашей первой мыслью была проблема с оборудованием, но обновление системных драйверов не помогло решить проблему.

Кто-нибудь еще сталкивался с проблемами BSODпод XP с Delphi 2010 генерируются приложения?Если да, есть ли у вас какие-либо предложения о том, как мы можем исправить эту проблему?

Спасибо за вашу помощь!

Ответы [ 2 ]

6 голосов
/ 12 июля 2011

В базовых библиотеках Delphi нет ничего, что могло бы вызвать BSOD напрямую.Как отметил Дэвид, программы на Delphi работают в пространстве пользователя.Однако, если они отправляют недопустимые данные в драйвер пространства ядра, это другое дело.

Вы сказали, что обновление D7-D2010, и первое, что приходит мне в голову, это обновление строки.Стандартный тип строки Delphi был изменен с AnsiString (1 байт на символ) на UnicodeString (2 байта на символ), и если вы отправляете неверный тип строки в драйвер или системную подпрограмму, это может вызвать странное поведение.

Первым делом я запустил бы полную сборку и следил за предупреждениями "неявного преобразования" от компилятора.Это означает, что вы смешиваете строковые типы.Найдите их и исправьте и посмотрите, поможет ли это.

Кроме того, если у вас есть какие-либо единицы импорта для внешних библиотек, и они используют API, которые принимают строковый (или, скорее всего, PChar) параметр, убедитесь, чтоони конвертируются в PAnsiChar.Delphi уже позаботилась об этом для Windows API, используемого в windows.pas, но если у вас есть что-то свое, вам нужно позаботиться об этом самостоятельно.

3 голосов
/ 12 июля 2011

BSOD можно проанализировать, открыв аварийный дамп с помощью 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 и аварийный дамп, можно получить стек вызовов, приводящий к аварийному завершению.

...