Delphi Runtime error 216 выдан в SysUtils.FinaliseUnits, номер строки отсутствует в файле карты - PullRequest
5 голосов
/ 17 марта 2011

У меня есть случайная ошибка времени выполнения 216, которая появляется при закрытии приложения.

Я выполнил отладку, насколько смогу, и ошибка выдается в SysUtils.FinalizeUnits .

Я просмотрел код и убедился, что все созданные объекты освобождены.

Число ошибок времени выполнения, 0040054A, равно , которого нет в файле карты .Вы знаете, что это значит?

Кто-нибудь может подсказать, как узнать, что выдает ошибку?

Ответы [ 6 ]

4 голосов
/ 02 марта 2016

Это ОЧЕНЬ старая проблема Delphi - неправильная обработка исключений в процессе инициализации / завершения модуля.

Проблема легко воспроизводится - просто сделайте любую программную ошибку / исключение (например, деление на ноль) в блоке инициализации любого устройства. Исключение будет создано правильно. Но затем, до возникновения исключения, процесс завершения модуля уничтожает объект исключения. И, таким образом, при доступе к объекту исключения произошла «ошибка времени выполнения 216».

4 голосов
/ 17 марта 2011

Я бы заподозрил утечку памяти (все ошибки Runtime 216, с которыми я сталкивался до сих пор) и использовал профилировщик (визуальный осмотр никогда не был так хорош, как инструмент).Поскольку вы используете Delphi XE, вам следует попробовать AQTime (он входит в комплект), см. Также

Delphi - Проверить, освобождается ли память «вовремя»

С уважением, Фрэнк

3 голосов
/ 17 марта 2011

Поскольку ошибка времени выполнения 216 является нарушением доступа , это может указывать на то, что вы пытаетесь использовать то, что уже освободили.

Адреса в файле карты основаны на0, но это не то, где ваш EXE-файл загружается в память.Ваш EXE загружается по предпочтительному базовому адресу , который обычно составляет 400000 долларов.Вычтите это из адреса, который у вас есть.Адрес, который вы ищете в файле карты, $ 0000054a.

2 голосов
/ 17 марта 2011

Я предлагаю вам попробовать режим полной отладки FastMM и либо статически связать его с вашим приложением, либо использовать его как пакет (если ваше приложение использует пакеты).

2 голосов
/ 17 марта 2011

Возник аналогичный вопрос, прочитайте: Как отладить сбой, возникающий только при завершении работы приложения?(Delphi)

Попробуйте использовать Профилировщик памяти , это может помочь в идентификации живых объектов после завершения работы приложения.

0 голосов
/ 27 сентября 2013

На официальном веб-сайте Microsoft упоминается, что эта проблема может возникнуть, если ваш компьютер заражен вирусом SubSeven Trojan.

Антивирусное программное обеспечение и средство очистки реестра Windows должны помочь.

...