Советы по устранению неполадок исключения EStackoverflow в Delphi IDE - PullRequest
3 голосов
/ 21 августа 2010

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

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

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

delphicoreide120.@Comppalmgr@TComponentPalettePageItemDelegate@CheckValid

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

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

Обновление

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

Ответы [ 2 ]

3 голосов
/ 21 августа 2010

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

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

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

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

Редактировать: хотя я упоминалlarge screen и side в моем ответе, чтобы сделать этапы отладки еще яснее:

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

- jeroen

0 голосов
/ 23 августа 2010

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

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

...