Página 1 de 1

Error.log nos erros fatais

Enviado: 29 Mar 2021 17:02
por marco.prodata
Mestres,
Como habilitar a criação do error.log quando houver um erro fatal no programa, como acontece no xhb.com?

Error.log nos erros fatais

Enviado: 29 Mar 2021 18:37
por Itamar M. Lins Jr.
Olá!
O xHarbour.com é uma cópia do Harbour.
No Harbour é hb_out.log

Procurando na internet achei isso:
contrib/xhb/xhberr.prg
Olhe ai no seu Harbour.

Tem esse exemplo.

Código: Selecionar todos

//Somewhere, Viktor Szakáts mentioned about "ErrorInHandler()." So I tried the following experiment:

PROC Main()
    set(_SET_HBOUTLOG,"error.log")
    ErrorInHandler() // to force an internal error
    RETURN
Para mudar o nome para error.log

Saudações,
Itamar M. Lins Jr.

Error.log nos erros fatais

Enviado: 16 Jun 2021 15:26
por marco.prodata
Voltando a essa questão, ao adicionar o set(_SET_HBOUTLOG,"error.log") mesmo assim continuou não gerando o arquivo de erro, tem q fazer mais alguma coisa pra ativar esse erro?

Error.log nos erros fatais

Enviado: 16 Jun 2021 15:49
por Itamar M. Lins Jr.
Olá!
Aqui está ok.

Código: Selecionar todos

itamar@itamar-desktop:~/fontes/exemplos$ ./error 
   
Unrecoverable error 9001: Error recovery failure                                                                                     
Called from ERRORINHANDLER(0)                   
Called from MAIN(3) in error.prg
itamar@itamar-desktop:~/fontes/exemplos$ ls *.log
error.log
itamar@itamar-desktop:~/fontes/exemplos$ cat error.log 
Application Internal Error - /home/itamar/fontes/exemplos/error
Terminated at: 2021-06-16 15:47:51
Unrecoverable error 9001: Error recovery failure
Called from ERRORINHANDLER(0)
Called from MAIN(3) in error.prg
------------------------------------------------------------------------
itamar@itamar-desktop:~/fontes/exemplos$ 
Saudações,
Itamar M. Lins Jr.

Error.log nos erros fatais

Enviado: 16 Jun 2021 15:51
por Itamar M. Lins Jr.
Olá!
O arquivo de erro hb_out.log é gerado em caso normal.
Isso é apenas para mudar o nome do arquivo. Nem precisa disso, no Harbour é hb_out.log

Saudações,
Itamar M. Lins Jr.

Error.log nos erros fatais

Enviado: 17 Jun 2021 12:40
por marco.prodata
Itamar M. Lins Jr. escreveu:Olá!
O arquivo de erro hb_out.log é gerado em caso normal.
Isso é apenas para mudar o nome do arquivo. Nem precisa disso, no Harbour é hb_out.log

Saudações,
Itamar M. Lins Jr.
O que seria um erro normal? Os erros de "Alias does not exist", se encaixam nesses erros?

Como meu aplicativo é em wvt, ele não gera a saida no console do erro, ai tive q adicionar temporariamente o xhb.hbc pra usar o errorsys do xharbour, mas gostaria de remove-lo e usar só o do harbour mesmo, com o rastro de onde deu exatamente o erro.

Error.log nos erros fatais

Enviado: 17 Jun 2021 12:57
por Itamar M. Lins Jr.
Olá!
O que seria um erro normal?
Erro é erro.
O arquivo de erro hb_out.log é gerado em caso normal.
Sem mexer em nada, se aparecer um erro vai criar o arquivo hb_out.log
Como meu aplicativo é em wvt, ele não gera a saida no console do erro, ai tive q adicionar temporariamente o xhb.hbc pra usar o errorsys do xharbour, mas gostaria de remove-lo e usar só o do harbour mesmo, com o rastro de onde deu exatamente o erro.
Não sei o seu procedimento.
Se tiver um exemplo pequeno que demonstre o problema, podemos testar.

Saudações,
Itamar M. Lins Jr.

Error.log nos erros fatais

Enviado: 17 Jun 2021 13:37
por marco.prodata
Segue código com o erro.

Código: Selecionar todos

*************
Function Main 
************* 
LOCAL ScreenWidth := Wvt_GetScreenWidth(), ScreenHeight := Wvt_GetScreenHeight()
wvt_Core()
wvt_Utils()
*-*-*
wvt_SetTitle('TESTE DE ERRO')
wvt_Setcodepage(255)

nHeight = Int(ScreenHeight / maxrow() * 0.85)
nWidth  = Int(ScreenWidth / maxcol() -.5)
wvt_setfont('Lucida Console', nHeight , nWidth )

@ 5,5 say "Erro vai acontecer na sequencia"
inkey(0)

// tentando abrir um arquivo que nao existe
use arquivo

@ 7,5 say "nunca chega aqui"

clear
return 
Compilar com: hbmk2 arquivo gtwvg.hbc

Error.log nos erros fatais

Enviado: 17 Jun 2021 14:30
por Itamar M. Lins Jr.
Olá!
Testei aqui e realmente com a WVG não grava o LOG.
Não sei pq. Provavelmente a WVG não usa o errorsys padrão do Harbour.
Aqui já é área do José Quintas. Não uso essa LIB.

Saudações,
Itamar M. Lins Jr.

Error.log nos erros fatais

Enviado: 17 Jun 2021 15:06
por marco.prodata
Ok, aguardar o mestre Jose Quintas dar uma olhada.

Error.log nos erros fatais

Enviado: 17 Jun 2021 23:16
por JoséQuintas
Itamar M. Lins Jr. escreveu:Testei aqui e realmente com a WVG não grava o LOG.
Não sei pq. Provavelmente a WVG não usa o errorsys padrão do Harbour.
Aqui já é área do José Quintas. Não uso essa LIB.
hb_out.log, que eu saiba é pra erros internos, os erros conhecidos não entram aí, aparecem somente em tela.
E WVT e WVG tem janela Windows, que se fecha no final, assim como toda LIB GUI.
No caso das LIBs GUI, elas tem rotina própria de erro.

O que fiz foi criar uma errorsys que grava no mesmo nome de arquivo de log.
De quebra, uso pra adicionar outros registros que me interessem, não apenas erros.

Código: Selecionar todos

/*
ERRORSYS                                                       *

...
2014.04.04.1355 - Nome do usuário JPA
2014.07.06.2130 - Ajuste ref. dos error 64 pra tentar contornar
2014.07.22.2130 - Ajuste ref. dos error 64 situações específicas
2014.08.08.1026 - Não tenta novamente em erro gravação
2014.09.24.1825 - Tenta somente se for erro 64 ref servidor
2014.10.28.0910 - Ajuste no texto
2016.06.30.1120 - Formatação do fonte
*/

#include "error.ch"
#include "hbgtinfo.ch"

// put messages to STDERR
#command ? <list,...>   =>  ?? hb_Eol() ; ?? <list>
#command ?? <list,...>  =>  OutErr(<list>)

* Note:  automatically executes at startup

PROCEDURE ERRORSYS

   ErrorBlock( { | e | JoseQuintasError( e ) } )

   RETURN

STATIC FUNCTION JoseQuintasError( e )

   LOCAL nCont, cMessage

   // by default, division by zero yields zero
   IF ( e:GenCode == EG_ZERODIV )
      RETURN 0
   ENDIF

   // build error message
   cMessage := ErrorMessage(e)
   hb_Default( @cMessage )
   IF ! Empty( e:OsCode )
      cMessage += ";(DOS Error " + Ltrim( Str( e:OsCode ) ) + ")"
   ENDIF
   IF cMessage == NIL
      cMessage := ""
   ENDIF

   // Only retry IF open error 2014.09.24.1810
   IF e:OsCode == 64 .AND. e:GenCode == EG_OPEN
      //@ 15, 15 SAY "Servidor sumiu. Tentar novamente em 2 segundos"
      Inkey(5)
      RETURN .T.
   ENDIF

   // For network open error, set NetErr() and subsystem default
   IF ( e:GenCode == EG_OPEN .AND. e:OsCode == 32 .AND. e:CanDefault )
      NetErr( .T. )
      RETURN ( .F. )     // NOTE
   ENDIF

   // for lock error during APPEND BLANK, set NetErr() and subsystem default
   IF ( e:GenCode == EG_APPENDLOCK .AND. e:CanDefault )
      NetErr( .T. )
      RETURN ( .F. )     // NOTE
   ENDIF
   Errorsys_WriteErrorLog( "SYSTEM ERROR", 1 ) // com id maquina
   @ MaxRow(), 0 SAY ""
   ? cMessage
   Errorsys_WriteErrorLog( cMessage )
   nCont := 2
   DO WHILE ( ! Empty( ProcName( nCont ) ) )
      cMessage := "Called from " + Trim( ProcName( nCont ) ) + "(" + Ltrim( Str( ProcLine( nCont ) ) ) + ")  "
      ? cMessage
      Errorsys_WriteErrorLog( cMessage )
      nCont++
   ENDDO
   Errorsys_WriteErrorLog( Replicate( "-", 80 ) )
   RUN ( "start notepad.exe hb_out.log" )
   // give up
   ErrorLevel( 1 )
   QUIT

   RETURN .F.

STATIC FUNCTION ErrorMessage( e )

   LOCAL cMessage := ""

   // start error message
   BEGIN SEQUENCE WITH __BreakBlock()
      cMessage := if( e:Severity > ES_WARNING, "Error ", "Warning " )
   ENDSEQUENCE

   // add subsystem name IF available
   IF ( ValType( e:SubSystem ) == "C" )
      cMessage += e:SubSystem
   ELSE
      cMessage += "???"
   ENDIF

   // add subsystem's error code IF available
   IF ( ValType( e:SubCode ) == "N" )
      cMessage += ( "/" + Ltrim(Str( e:SubCode ) ) )
   ELSE
      cMessage += "/???"
   ENDIF

   // add error description IF available
   IF ( ValType( e:Description ) == "C" )
      cMessage += ( "  " + e:Description )
   ENDIF

   // add either filename or operation
   IF ! Empty( e:Filename )
      cMessage += (": " + e:Filename )
   ELSEIF ! Empty( e:Operation )
      cMessage += ( ": " + e:Operation )
   ENDIF

   RETURN cMessage

FUNCTION Errorsys_WriteErrorLog( cText, nDetail )

   LOCAL hFileOutput, cFileName, nCont, nCont2

   hb_Default( @cText, "" )
   hb_Default( @nDetail, 0 )

   IF nDetail > 0
      Errorsys_WriteErrorLog()
      Errorsys_WriteErrorLog( "Error on "       + Dtoc( Date() ) + " " + Time() )
      Errorsys_WriteErrorLog( "EXE Name; " + hb_Argv(0) )
      Errorsys_WriteErrorLog( "JPA: "           + AppVersaoExe() )
      Errorsys_WriteErrorLog( "Login JPA: "     + AppUserName() )
      Errorsys_WriteErrorLog( "Alias:  "        + Alias() )
      Errorsys_WriteErrorLog( "Folder: "        + hb_cwd() )
      Errorsys_WriteErrorLog( "Windows: "       + OS() )
      Errorsys_WriteErrorLog( "Computer Name: " + GetEnv( "COMPUTERNAME" ) )
      Errorsys_WriteErrorLog( "Windows User: "  + GetEnv( "USERNAME" ) )
      Errorsys_WriteErrorLog( "Logon Server: "  + Substr( GetEnv( "LOGONSERVER" ), 2 ) )
      Errorsys_WriteErrorLog( "User Domain: "   + GetEnv( "USERDOMAIN" ) )
      Errorsys_WriteErrorLog( "Harbour: "       + Version() )
      Errorsys_WriteErrorLog( "Compiler: "      + HB_Compiler() )
      Errorsys_WriteErrorLog( "GT: "            + hb_GtInfo( HB_GTI_VERSION ) )
      Errorsys_WriteErrorLog()
      Errorsys_WriteErrorLog()
   ENDIF
   cFileName := "hb_out.log"
   IF ! File( cFileName )
      hFileOutput := fCREATE( cFileName )
      fClose( hFileOutput )
   ENDIF

   hFileOutput := fOpen( cFileName, 1 )
   fSeek( hFileOutput, 0, 2 )
   fWrite( hFileOutput, cText + Space(2) + hb_Eol() )
   IF nDetail > 1
      nCont  := 1
      nCont2 := 0
      DO WHILE nCont2 < 5
         IF Empty( ProcName( nCont ) )
            nCont2++
         ELSE
            cText := "Called from " + Trim( ProcName( nCont ) ) + "(" + Ltrim( Str( ProcLine( nCont ) ) ) + ")  "
            fWrite( hFileOutput, cText + hb_Eol() )
         ENDIF
         nCont++
      ENDDO
      fWrite( hFileOutput, hb_Eol() )
   ENDIF
   fClose( hFileOutput )

   RETURN NIL
Basicamente é a errorsys normal, mas gravando em disco ao invés de mostrar na tela, e abrindo no bloco de notas.
Mesmo que o programa feche, o bloco de notas continua aberto com o texto do erro.
Assim funciona em qualquer lib GUI - com janela Windows.

Mas é cumulativo.
Isso pra enviar erros por email, e só após isso apago (na verdade acumulo num errogeral.log).
Se não apagar, eles vão se acumulando no arquivo eternamente.

Error.log nos erros fatais

Enviado: 18 Jun 2021 10:01
por marco.prodata
Pra usar essa sua errorsys como faço? só chamar o mesmo no prg principal?

Error.log nos erros fatais

Enviado: 18 Jun 2021 10:29
por JoséQuintas
Retira a parte que não tem no seu aplicativo - vai saber porque vai dar erro de faltar função.

É só compilar/linqueditar junto, nada pra mexer no aplicativo.

Error.log nos erros fatais

Enviado: 18 Jun 2021 14:33
por marco.prodata
Obrigado ao José Quintas e ao Itamar, funcionando filé agora, entendi o processo ai copiei o errsys original e fiz alguns ajustes basicos copiando a ideia do modelo que o Jose Quintas mandou e tá funcionando.