MadExcept для Delphi не печатает трассировку стека после сбоя приложения

Подробный вопрос:

Мы пытаемся перехватить трассировку стека (bugreport.txt) с помощью MadExcept в приложении delphi, где поток завершает работу приложения с фатальной ошибкой. Но MadExcept не печатает никакой трассировки стека после сбоя приложения. Есть идеи почему?

НАШ КОД:

procedure TMainForm.WSServerExecute(AContext: TIdContext);
begin
  try
    HTMLExecute(AContext);
  except
    on E: Exception do
    begin
      if not(E is EIdException) then
      begin
        LogData.AddError('HTMLExecute error: ' + E.Message);
        madExcept.HandleException;
      end;
      raise;
    end;
  end;
end;

Эта процедура вызывается, когда клиент устанавливает соединение веб-сокета с сервером. Это поток, созданный компонентом Indy TCPServer. Функция HTMLExecute - это то, что читает и записывает пакеты между клиентом и сервером. Я обернул это в блок try..except, чтобы перехватить любые исключения. Строка LogData - это то, что записывает ошибку в журнал ошибок, а строка madExcept должна создать файл bugreport.txt. Строка Raise передает исключение обратно в Indy, чтобы она знала, что произошла фатальная ошибка, и прерывает поток.

2 ответа

Причина, по которой madExcept не обрабатывает исключение, заключается в том, что вы уже поймали его с on E:Exception do справиться с этим самостоятельно. Просто дайте madExcept.HandleExcept исключение для обработки:

madExcept.HandleException(etNormal, E);

Вы можете попробовать использовать RegisterHiddenExceptionHandler(stDontDync), Смотрите документацию для более подробной информации. В вашем обработчике просто сделайте это:

procedure YourHiddenExceptionHandler(const exceptIntf: IMEException; var handled: boolean);
begin
  handled := false;
end;

Вышеприведенный трюк заставляет madexcept работать и с обработанными исключениями, конечно, рискованно использовать его в производстве...

Другие вопросы по тегам