Почему я получаю ошибки памяти из приложения Delphi 2006, работающего под Windows XP - PullRequest
2 голосов
/ 26 августа 2010

У меня есть приложение D2006, которое использует FastMM4 (например, у него есть "FastMM4" в начале предложения использования в файле DPR). Я знаю, что Delphi использует FastMM4 в качестве диспетчера памяти, но в загруженной версии есть больше опций отладочного дампа.

Недавно я пытался запустить приложение на промышленном ПК с одноплатным планшетным ПК под управлением Windows XP. Процессор не от Intel "Vortex". Приложение завершается с ошибкой памяти при запуске, а затем завершает работу с жалобой FastMM4 о доступе к памяти после ее освобождения.

Удаление всех следов FastMM4 из исходного кода, кажется, излечивает его - приложение работает нормально.

Мой вопрос. Что является причиной загруженной версии FastMM4, которая вызывает эту проблему? Я видел отдельные истории о сбоях с процессорами FastMM4 и не-Intel, которые, похоже, связаны с использованием кода ASM. FastMM4 содержит директиву, заставляющую генерировать код не-ASM, но это не решает проблему.

Я немного обеспокоен тем, что проблемы со встроенной версией FastMM4 D2006 могут все еще существовать, и я просто еще не видел.

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

Ответ: ничего.

Windows XP Embedded - это ПРОСТО Windows XP без некоторых компонентов, и ничего более.Те компоненты, которые присутствуют, такие же, как в обычном XP (даже двоичный эквивалент).В основном XPE - это XP с некоторыми удаленными DLL-библиотеками, а некоторые записи реестра отсутствуют (я знаю, что я здесь слишком упрощаю).в вашем приложении, что некоторые библиотеки могут отсутствовать, а некоторые компоненты могут быть установлены неправильно.Насколько я знаю, FastMM не полагается на какие-либо специальные компоненты, кроме основного Win32 API, который явно присутствует, иначе ваше приложение вообще не будет работать (и вряд ли что-нибудь из пользовательского режима).проблема не в FastMM4, а в чем-то другом.Скорее всего, это плохая обработка отсутствующих библиотек.Возможно, какая-то часть вашего кода динамически загружает DLL, но не может проверить, действительно ли она загружена, или читает некоторые настройки из реестра и не может обработать отсутствующие данные.Это приводит к повреждению памяти, которое благодаря удаче становится очевидным при использовании одного диспетчера памяти, но не при использовании другого.

1 голос
/ 27 августа 2010
...