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

Я использую Delphi TApplication.OnException Событие, чтобы поймать необработанные исключения

Это хорошо работает, но не дает достаточной информации о том, где произошло исключение то есть "Катастрофический отказ"

Как я могу узнать, какая процедура сделала ошибку?

procedure TFrmMain.FormCreate(Sender: TObject);
begin
  Application.OnException := MyExceptionHandler;
end;

procedure TFrmMain.MyExceptionHandler(Sender : TObject; E : Exception );
begin
  LogException (E.Message);     
  Application.ShowException( E );
end;

Ответ 1

Вы можете получить адрес памяти, в котором было выбрано исключение, с помощью переменной ExceptAddr (системный блок). Но если вам нужна трассировка стека, вы можете использовать один из инструментов 3rdParty MadExcept, EurekaLog или открытый JCLDebug (часть JCL) с открытым исходным кодом.

Ответ 2

Самый простой и быстрый способ - использовать JCL исключение и отладочную поддержку. После установки JCL не забудьте вставить символы отладки в двоичный файл (Projects → JCL debug expert → Insert JDBG data для этого двоичного файла → Включено) и добавить в проект окно исключения JCL (Файл → Создать... → Диалоги → Исключение).

Если установщик JCL не смог добавить это диалоговое окно в репозиторий объектов, и он не появляется (случается со мной несколько раз), добавьте его вручную, скопировав файлы .pas и .dpr из jcl-install-dir\experts\debug\dialog в ваш проект и добавление их вручную или закрыть Delphi, отредактируйте %DELHPIDIR%\bin\delphi32.dro в текстовом редакторе и добавьте в него что-то вроде этого (корректируя пути, конечно:)

[P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLG]
Type=FormTemplate
Name=Exception Dialog
Page=Dialogs
Icon=P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLG.ICO
Description=JCL Application exception dialog
Author=Project JEDI
DefaultMainForm=0
DefaultNewForm=0
Ancestor=

[P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL]
Type=FormTemplate
Name=Exception Dialog with Send
Page=Dialogs
Icon=P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL.ICO
Description=JCL Application exception dialog
Author=Project JEDI
DefaultMainForm=0
DefaultNewForm=0
Ancestor=