Enviando informações de depuração para o Event Log do Delphi

Um dos mais tradicionais métodos utilizados para depurar aplicações é enviar informação para um label, edit, arquivo, showmessage e outros mais. Muitas vezes o tempo e necessidade nos faz utilizar métodos diferentes.

No Delphi você tem a janela chamada Event Log que apresenta diversas mensagens enviada pelo IDE quando você executa uma aplicação em modo de debug, veja a figura abaixo.

Debug

Nada mais pratico do que você fazer o mesmo com suas aplicações, porque não adicionar suas mensagens ao event log? É pratico e fácil, não se preocupe com o fato de misturar as mensagens, você configurar a janela Event Log para apresentar os seus logs com uma cor diferente e desta forma facilitar a visualização. Na janela Event Log, com o botão direito selecione propriedades e configurar a cor do Debug Output String, veja a figura abaixo:

Debug setup

Com o seu ambiente configurado, basta agora utilizar o método OutputDebugString que é parte da unit Windows, como dica adicional eu recomendo utilizar o método IsDebuggerPresent para garantir que este método será usando apenas quando a aplicação estiver sem executada em modo de debug. Como boa prática eu utilizo uma classe que contém um class method para enviar a mensagem para o Event Log, abaixo o código.

unit DebugHelper;

interface

uses Windows;

type
  TDebuggerHelper = class
  public
   { public declarations }
   class procedure LogDebug( s : String);
  end;

  function IsDebuggerPresent: LongBool; external kernel32 name 'IsDebuggerPresent';

implementation

{ TDebuggerHelper }

class procedure TDebuggerHelper.LogDebug(s: String);
begin
  if IsDebuggerPresent then
     OutputDebugString(PWideChar(s));
end;

end.

A classe TDebuggerHelper contém o método LogDebug que irá receber o conteúdo String a ser enviado ao Event Log, este método utiliza o método IsDebuggerPresent para certificar que a mensagem será enviada apenas quando a aplicação estiver sendo executada em modo de debug.

Abaixo um exemplo onde esta técnica foi utilizada para saber exatamente em que momento foi criada a classe TUser, utilizei neste caso o Event Log para validar que o controle de instâncias do DataSnap estivesse funcionando corretamente.

procedure TDMServerContainer.DSSCUserCreatereInstance
  (DSCreateInstanceEventObject: TDSCreateInstanceEventObject);
begin
  if not Assigned(User) then
  begin
    User := TUser.Create;
    TDebuggerHelper.LogDebug('Create a TUser instance');
  end
  else
    TDebuggerHelper.LogDebug('TUser already exist');
  DSCreateInstanceEventObject.ServerClassInstance := User;
end;

Você pode fazer o download do código fonte do DataSnap onde foi utilizado esta técnica aqui

3 respostas

Deixe uma resposta

Want to join the discussion?
Feel free to contribute!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *


Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.