1с ошибка запуска 216

Обновлено: 07.07.2024

Эту небольшую заметку я посвящу рассказу о поиске ошибки (runtime error 216) в проекте при его закрытии. Как оказалось ошибка была тривиальна в своей сути, но необычна своими последствиями.

на строке dec ESI если мне память не изменяет, что показалось странным. Тут я понял, что зашел в тупик, и мои знания программирования не способны решить данную задачу стандартными методами отладки. Когда ошибка не очевидна, то первым, что можно сделать это сократить объем кода, чтобы попытаться таким образом ее как либо локализовать. Так что я создал копию проекта и начал удалять юниты один за другим, проверяя возникновение ошибки. В конечном счете осталось 3 юнита: главная форма приложения, модуль данных, модуль описания глобальных переменных и типов. Третий модуль не выполнял никаких действий, так что влиять теоретически не мог. Модуль данных и главная форма создавались в приложении автоматически. Помня о том что секции finalization есть только в юнитах TMS, а ошибка возникает где то в FinalizeUnits() начал удалять компоненты с главной формы, на этом правда не остановился. главная форма в итоге осталась пустая, и на ней был расположен лишь ADOConnection (не спрашивайте почему объект подключения к БД на главной форме а не в модуле данных (: ) Вот тут фокус, в секции uses не осталось ни одного юнита от TMS. Откуда же тогда ошибка в FinalizeUnits() ? Следующим шагом была очистка модуля данных (вобще то они выполнялись одновременно). В конечном счете все приложение состояло из 4х функций которые были максимально упрощены. Главная форма содержала обработчик события onCreate() в к котором был вызывался метод Connect() [см. код] модуля данных.

Итак, глобальный массив regionExists был определен как

переменная id имела значение явно не из интервала 0..1. (28 было). Следовательно происходила запись в чужую память. Отметим так же, что после объявления массива далее была определена переменная region - структура вида:

Память при этом выделяется последовательно т.е адрес элемента regionExists[28] ссылался куда то на начало строки name переменной reg. В принципе чего страшного? Записали данные в чужой буфер, но он ведь статичен, и был пуст на тот момент. Установка требуемого значения id решила проблему. Однако, оставим все без изменений. В чем же необычность?.

  1. В силу каких то магических обстоятельств, если мы закомментируем вызов loadOkvedNames() то программа закрывается без ошибок.
  2. Если мы в коде функции LoadOkvedNames закомментируем, например, строку inc(i) то программа вылетает при запуске. То же самое касается всего содержимого между with adoQuery1 do begin и end;

Обычно ли такое поведение? Нет, вряд ли. Какие можно сделать выводы? -

  1. Лучше лишний раз написать код инициализации переменной начальным значением, чем потом долго искать ошибку. Это правда не касается членов классов, которые инициализируются нулевыми значениями.
  2. Стоит использовать Range check в настройках компиляции, хотя бы в DEBUG варианте сборки.

Комментарии

Была такая же ошибка (runtime error 216) при выходе из программы -- причина оказалась в том, что при некоторых условиях одна из форм не уничтожалась и сбивала работу всего приложения.

А вообще, подобное "магическое поведение кода" встречается регулярно -- ошибки, на появление которых влияют совершенно левые строчки из другой части проекта, либо странное поведение отладчика, и перескок выполнения текущей команды в неожиданное место.

Если вижу подобные признаки -- значит надо где-то искать неинициализированную либо неправильно уничтоженную переменную.

Самое обычное повреждение памяти. Повреждение памяти - причина больше половины случаев для run-time error 216.

Ошибки Runtime часто возникают, когда пользователь работает с операционной системой Windows. Проблема часто возникает из-за отсутствующего или поврежденного файла в реестре Windows, но иногда отсутствует приложение, которое может стать причиной появления ошибки 216 во время его выполнения. В других случаях инфекция какого-либо типа может повлиять на работу компьютера и приводит к возникновению этой ошибки.

p, blockquote 1,0,0,0,0 -->

Что такое Runtime Error 216?

p, blockquote 2,0,1,0,0 -->

p, blockquote 3,0,0,0,0 -->

p, blockquote 4,0,0,0,0 -->

Когда компьютер заражен SubSeven Trojan, virus, может произойти ошибка runtime error 216. Она, как правило, отображается в виде “Runtime Error 216 at Address”, если вы были инфицированы этим вирусом. Сам вирус был определен как низкого уровня риска инфекции. Тем не менее, этот вирус может замедлить производительность вашего компьютера и стать раздражающим, так как он блокирует доступ к определенным функциям на вашем компьютере.

p, blockquote 5,1,0,0,0 -->

Если вы подозреваете, что ваш компьютер был заражён вирусом SubSeven Trojan, Вам необходимо выполнить надежное антивирусное приложение. Как правило, Вы заметите признаки инфекции, такие как проблемы с производительностью компьютера, если он был заражен этим вирусом. Если у вас уже существует антивирусная программа, установленная на компьютере, проверьте наличие обновлений и установите их, если таковые имеются, перед запуском приложения. Если нет, то выберите одну из доступных антивирусных программ, чтобы загрузить, установить и запустить её на вашем компьютере. Настройка надежного брандмауэра должна быть также полезной в предотвращении reinfestation этого троянца.

p, blockquote 6,0,0,0,0 -->

Общие симптомы вируса SubSeven Trojan

p, blockquote 7,0,0,1,0 -->

Если вы были заражены вирусом SubSeven Trojan, вы должны соблюдать одно или несколько из следующих действий:

  • Runtime error 216 появляется при попытке использовать Internet Explorer.
  • CD-привод на вашем компьютере открывается случайно, когда вы не пытаетесь использовать его.
  • Использование Интернета медленнее, когда вы хотите получить доступ к Интернету.
  • Файлы пропадают.
  • Программы работают некорректно.

p, blockquote 9,0,0,0,0 --> p, blockquote 10,0,0,0,1 -->

Читайте также: