Возможные неясные причины абстрактной ошибки в Delphi?
В проекте Delphi 7 мы установили FastMM. Вскоре после этого мы заметили, что одна из форм начала выдавать абстрактное сообщение об ошибке при закрытии. Я много отлаживал и пока не могу найти причину. Обычная причина этого сообщения об ошибке здесь не применима. Приложение не определяет абстрактные классы. Я также искал форму для возможного использования TStrings или что-то подобное. Самое главное, мы не (ну, мы думаем, мы не сделали) никаких изменений в этой форме. Это просто сломалось.
- Существуют ли другие возможные причины этой ошибки, кроме попытки вызова не реализованного метода?
- Есть ли вероятность, что FastMM включил в приложение какую-то неясную ошибку, которая оставалась скрытой до сих пор?
Если ответ на эти вопросы - "нет", я просто продолжу поиск нереализованного вызова метода, с облегчением, что я не пропускаю что-то еще.
5 ответов
В случае повреждения памяти могут возникать всевозможные ошибки, и найти причину очень сложно.
Чтобы ответить на ваши вопросы: 1) Да, абстрактная ошибка также может быть вызвана повреждением памяти, и 2) Да, включение FastMM может сделать видимыми ошибки, которые обычно проходят незамеченными (но все же должны быть исправлены).
Некоторые общие советы по поиску ошибок памяти:
- Попробуйте установить "FullDebugMode" в FastMM.
- Убедитесь, что все, что вы создаете, соответствует бесплатно.
- Убедитесь, что ничто не освобождается более одного раза.
- Убедитесь, что объект не используется после того, как он был освобожден (или до того, как он был создан).
- Включите подсказки и предупреждения (и исправьте их, когда они появятся).
"Это просто сломалось" - это, вероятно, всегда было сломано, но теперь вы знаете.
Я видел проблемы при закрытии формы как часть события кнопки. Форма уничтожается, а затем остальные сообщения о кнопках отправляются на уже не существующую кнопку. Метод Release избегает этого путем (из памяти) отправки сообщения wm_close обратно в форму
Вы можете попробовать добавить u_dzAbstractHandler в ваш проект. При вызове метода должна возникать абстрактная ошибка, чтобы его было легче отлаживать. Конечно, это помогает только тогда, когда ошибка возникает при запуске в отладчике.
http://sourceforge.net/p/dzlib/code/145/tree/dzlib/trunk/src/u_dzAbstractHandler.pas
Ответ на вопрос 1:
Да. Вот что вызвало в моем случае абстрактную ошибку:
TWinControl(Sender).Visible:= FALSE;
Это работало, когда отправитель был TButton, но вызывал ошибку (конечно), когда отправитель был TAction.
Ответ на вопрос 2: Да. Я тоже это видел. Нам должно быть совершенно ясно, что это не означает, что FastMM глючит. Ошибка была "неактивной". FastMM только сработал.
На самом деле вы должны полагаться на FastMM еще больше, чтобы найти свою проблему. Для этого переключите FastMM в режим полной отладки. Это поможет вам с:
Убедитесь, что объект не используется после того, как он был освобожден (или до того, как он был создан)
Кроме того, в некоторых случаях весь проект был испорчен, и я получил абстрактную ошибку. Ничего не работало, пока я не удалил файл DPROJ. Просто сравните ваш текущий файл DPROJ и тот, что у вас за спиной, и вы увидите, как IDE создала файл.
Может быть, одна из ваших абстрактных функций / процедур в базовом классе не реализована;
попробуй это:
например
type
TBaseClass = class (TObject)
public
procedure DoSomething; virtual; abstract; //not implemented procedure
end;
type
TInheritedClass = class (TBaseClass)
public
procedure DoSomething; override;
end;
//Implementation
procedure TInheritedClass.DoSomething;
begin
//your code
end;