Здравствуйте уважаемые!
Есть рабочий проект (в исходниках), при выходе иногда возникает RunTime Error 204.
Пока что выяснил лишь то, что эта ошибка возникает при освобождении главной формы приложения.
Вопрос:
как можно проследить, при освобождении какого именно компонента происходит эта ошибка.
Заранее спасибо!
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
14-10-2009 15:42 | Вопрос к автору: запрос дополнительной информации
>>>Ну, я ж вам так и сказал. У вас происходит вылет в какой-то секции finalization после финализации модуля SysUtils. "end." - это и есть выполнение всех процедур финализации.
Наверное я чего-то не понимаю :)
В проекте не используются блоки finalization. Или Вы имеете ввиду, что ошибка происходит при финализации системных модулей?
>>>Попробуйте включить Use debug DCU в проекте и сделать build проекту. Потом на "end." нажмите F7, чтобы пойти дальше (попадёте в System._Halt0). Далее следуйте до вызова процедуры FinalizeUnits. Короче, дальше сами разберётесь.
Про Use debug DCU - не знал, спасибо, попробую.
>>>Или, если понимаете asm, попробуйте по шагам в окне дизассемблера (View/Debug windows/CPU).
К сож. нет, это уже хардкор для меня :(
>>>Загрузка DLL статическая или динамическая? Есть также вероятность, что ошибка происходит при деинициализации DLL (для статической загрузки).
Динамическая. И она корректно выгружается (по крайней меря я так считаю), это я проверил первым делом, т.к. с ней уже была аналогичная проблема, связанная именно с деинициализацией этой длл.
Правда, я не очень понял причин ошибки:
возникала та же RunTime error 204, если библиотека не выгружалась при выходе из программы.
Как только была сделана процедура освобождения длл, ошибка исчезла.
Ну, я ж вам так и сказал. У вас происходит вылет в какой-то секции finalization после финализации модуля SysUtils.
"end." - это и есть выполнение всех процедур финализации.
Попробуйте включить Use debug DCU в проекте и сделать build проекту. Потом на "end." нажмите F7, чтобы пойти дальше (попадёте в System._Halt0). Далее следуйте до вызова процедуры FinalizeUnits. Короче, дальше сами разберётесь. Или, если понимаете asm, попробуйте по шагам в окне дизассемблера (View/Debug windows/CPU).
Загрузка DLL статическая или динамическая? Есть также вероятность, что ошибка происходит при деинициализации DLL (для статической загрузки).
Исходники есть, менять их могу.
Программа состоит из ~60 форм.
Также, программа юзает самописную Длл-ку, длл-ка в свою очередь содержит форму.
"Глючная" процедура программы - выгрузка данных в определенном формате. Выгрузку производит процедура, внутри этой процедуры вызывается масса функций, в том числе и функция из Длл-ки.
Выгрузка происходит успешно, никаких ошибок не наблюдается.
После выгрузки, при закрытии главной формы программы (не Длл-ки), происходит Runtime error.
Когда дебажил программу (ну, пытался понять где происходит ошибка), понял лишь то, что ошибка появляется на самом последнем операторе end. которых находится в dpr-файле.
program NW_Project;
{$D+}
uses
FastMM4,
sharemem,
dialogs,
Forms,
SysUtils,
Unit1 in 'Unit1.pas' {Main_Form},
тут куча юнитов пропущена
frmAccSepNew in 'frmAccSepNew.pas' {SepSchet_New};
{$R gorod.res}
begin
App := Application;
Application.Initialize;
Application.CreateForm(TMain_Form, Main_Form);
Я плохо выразился.
Ошибка возникает после выполнения определенной процедуры, но внутри этой процедуры вызывается масса других функций и процедур. Хуже, тут же идет работа с формой внутри DLL-ки.
Не понял. Выход из программы - он тут причём или нет? Идёт вызов функций из DLL или, наоборот, мы в DLL и нас вызывают?
>>> Автор программы не я, мне оч. трудно даже примерно понять что может быть источником ошибки.
У вас вообще есть доступ к исходникам программы? Менять их можете?
Попробуйте тупо проставить по тексту программы:
OutputDebugString('step 1 passed');
// что-то делаем
OutputDebugString('step 2 passed');
// что-то делаем
OutputDebugString('step 3 passed');
>>>И не видя вашей программы вам никто наперёд не скажет, в чём проблема.
Прекрасно понимаю =)
>>>Попробуйте отключать блоки/модули программы по одному и пытаться воспроизвести ошибку. Как только, после очередного отключения, ошибка исчезла - вы нашли виновника. Для этого желательно бы ещё добиться 100% воспроизводимости ошибки.
Я плохо выразился.
Ошибка возникает после выполнения определенной процедуры, но внутри этой процедуры вызывается масса других функций и процедур. Хуже, тут же идет работа с формой внутри DLL-ки.
Автор программы не я, мне оч. трудно даже примерно понять что может быть источником ошибки.
Вопрос примерно такой: можно ли проследить, при освобождении какого компонента (объекта, формы или еще чего) или при обращении к какому участку памяти происходит эта ошибка (исключение).
А и не в компоненте скорее всего дело. И не при освобождении формы это происходит, а при выходе из программы. В обычной ситуации, все run-time ошибки преобразовываются модулем SysUtils в обычные исключения Delphi.
Если в программе возникает Run-Time, то это может быть только в двух случаях:
1). Во время инициализации программы до того, как обработчики из SysUtils инициализировались.
2). Во время закрытия программы после того, как обработчики из SysUtils убраны.
(ну не считая случаев, когда вы как-то умудрились полностью угробить обработку ошибок в программе).
Run-time ошибка номер 204 означает "Invalid pointer operation" и в обычных условиях (с работающим SysUtils) эквивалентна исключению EInvalidPointer.
Одна из возможных причин - повторное удаление уже освобождённых ресурсов в секции finalization.
Но вообще, причин может быть тонна. И не видя вашей программы вам никто наперёд не скажет, в чём проблема.
Попробуйте отключать блоки/модули программы по одному и пытаться воспроизвести ошибку. Как только, после очередного отключения, ошибка исчезла - вы нашли виновника. Для этого желательно бы ещё добиться 100% воспроизводимости ошибки.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.