Я работаю на месте с клиентом и пытаюсь помочь им в решении сложной проблемы.Я надеюсь, что в Delphi есть инструмент или функция, которую мы можем использовать, чтобы заглянуть во внутреннюю работу, чтобы помочь нам найти проблему.
Вот общий обзор проблемы, с которой мы имеем дело.Это коммерческое приложение, которое в настоящее время развернуто в Delphi 5. За последний год приложение было перенесено в Delphi XE.Миграция почти завершена, но есть некоторые серьезные ошибки.
Само приложение очень большое, с сотнями модулей и множеством сторонних и пользовательских компонентов.В одной конкретной ситуации, с которой мы сталкиваемся, создается основная форма, а затем приложение закрывается перед отображением этой главной формы.Результатом является сбой, который происходит во время этого завершения, поскольку модули завершаются.
Отладчик прерывается в функции RaiseException в kernel32, которая вызывается NotifyNonDelphiException.Мы попытались установить непрерывную точку останова, которая регистрирует стек вызовов изнутри NotifyNonDelphiException, но это не дает нам ничего полезного.Стек вызовов содержит только методы, обработавшие исключение, а именно RtlRaiseStatus и KUserExceptionDispatcher.
Как определить код, который генерирует исходное исключение, которое обрабатывается NotifyNonDelphiException?
edit: вот два изображения, снятые после одного случая исключения.Первое - повышенное исключение, а второе - окно ЦП после закрытия диалогового окна исключения.
Новое редактирование:
Прошло больше недели с тех пор, как я разместил этот вопрос, и я впечатлен различными ответами.Некоторые комментарии к первоначальному вопросу были наиболее ценными, но некоторые ответы сами по себе очень информативны.
Мой визит к этому клиенту завершен, и я попрошу их рассмотреть ответы, которые были размещены здесь.,Хотя мы не смогли отследить фактический источник ошибки, причина ошибки была более чем очевидной.Много лет настройки пользовательского интерфейса без серьезного рефакторинга привели к нестабильному процессу входа в систему.Когда пользователь отменил вход, основная форма находилась в состоянии частичной инициализации.Когда этому процессу не было разрешено запускаться, что и происходило, когда пользователь прерывал вход в систему, возникали очень серьезные проблемы с завершением.
Компания приобрела AQTime Pro, чтобы помочь выявить будущие проблемы, но требуется рефакторинг процесса входа в систему, и это решит проблему в долгосрочной перспективе.
В какой-то момент я рассмотрелудаляя этот вопрос, но я решил оставить его в курсе, так как я считаю, что другие найдут много отличных предложений, которые были опубликованы информативно.
В настоящее время я принимаю ответ @Deltics, так как я ненавижуоставив вопрос без ответа.Однако я прошу зрителей по этому вопросу также рассмотреть все остальные ответы и комментарии, и они одинаково ценны.