Советы по устранению неполадок, связанных с исключением EStackoverflow в Delphi IDE

Я использую Delphi 2009. Когда я пытаюсь просмотреть форму в редакторе форм, я продолжаю получать переполнение стека. Поэтому я сделал то, что сделал бы любой другой. Я использовал Delphi для отладки самого себя или, скорее, другого экземпляра IDE.

Итак, я знаю, где происходит переполнение, я просто не знаю, что с этим делать. В этой форме есть специальный компонент, который перехватывает вызовы TForm.WindowProc, чтобы он мог отвечать на определенные сообщения winapi. Переполнение стека происходит, когда компонент вызывает настоящий WindowProc.

Когда я прерываю исключение, стек вызовов заполняется сотнями вызовов:

delphicoreide120.@Comppalmgr@TComponentPalettePageItemDelegate@CheckValid

До сих пор мне не удавалось отследить фактическое сообщение, передаваемое в WindowProc.

Любая помощь будет оценена по достоинству.

Обновить

Я добился некоторого прогресса. Отследил сообщение, которое, по-видимому, отключало эту функцию. Это WM_CHILDACTIVATE. Когда это сообщение передается WindowProc формы, оно запускает серию вызовов в среде IDE, которые заканчиваются переполнением стека. Теперь мне просто нужно выяснить, почему.


person Kenneth Cochran    schedule 20.08.2010    source источник
comment
Можно ли изменить источник компонента?   -  person Craig Stuntz    schedule 21.08.2010


Ответы (2)


Можете ли вы сломать, когда генерируется само исключение EStackOverflow (т.е. в MapFault или ErrorHandler функции модуля SysUtils) или только когда EStackOverflow уже поднят?

Когда вы не можете сломаться: к моменту запуска отладчика стек может быть уже частично поврежден.

Если вы можете сломать там, сделайте это, а затем попробуйте просмотреть стек (более новые версии Delphi лучше в этом), чтобы найти оскорбительный параметр в WindowProc.

При отладке дизайнера форм Delphi; очень удобно иметь два монитора или установку с большим экраном: вы можете запускать вызывающий нарушение экземпляр Delphi на одном (стороне) ваших мониторов, экземпляр Delphi для отладки — на другом.

Изменить: хотя я упомянул large screen и side в своем ответе, чтобы сделать шаги отладки еще более понятными:

  1. Начните с того, что убедитесь, что отлаживаемый и вызывающий нарушение экземпляр Delphi визуально не перекрываются.
  2. Затем медленно перекрывайте все больше и больше проблемного экземпляра Delphi все больше и больше, пока не получите переполнение стека.

--jeroen

person Jeroen Wiert Pluimers    schedule 20.08.2010
comment
@Mason: если у вас нет двух мониторов (да, некоторые из нас страдают от этого :-), убедитесь, что формы/окна приложения не закрыты окнами IDE, отлаживающими его (по сути делайте то же самое, что и с двумя мониторами) . Это очень поможет при работе с сообщениями, поскольку вы не получаете переключения и перерисовки приложения. - person Marjan Venema; 21.08.2010

Фу! Оказалось, что это был сторонний пакет компонентов, который я недавно установил, и он совершенно не имел отношения к тому, где происходило исключение. Пробовал просматривать пустую форму в новом проекте с теми же результатами.

Что-то пошло не так либо при компиляции, либо при установке пакета. Его пересборка/переустановка привела к исчезновению исключения.

person Kenneth Cochran    schedule 23.08.2010