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.
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:
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
Muito boa a dica, parabens.
Pretendo usar em meus sistemas.
Valeu pela dica!
mto bom, simples e mto util…