Error.log nos erros fatais

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Error.log nos erros fatais

Mensagem por marco.prodata »

Mestres,
Como habilitar a criação do error.log quando houver um erro fatal no programa, como acontece no xhb.com?
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Error.log nos erros fatais

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Error.log nos erros fatais

Mensagem 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?
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Error.log nos erros fatais

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Error.log nos erros fatais

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Error.log nos erros fatais

Mensagem 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.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Error.log nos erros fatais

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Error.log nos erros fatais

Mensagem 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
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Error.log nos erros fatais

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Error.log nos erros fatais

Mensagem por marco.prodata »

Ok, aguardar o mestre Jose Quintas dar uma olhada.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Error.log nos erros fatais

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Error.log nos erros fatais

Mensagem por marco.prodata »

Pra usar essa sua errorsys como faço? só chamar o mesmo no prg principal?
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Error.log nos erros fatais

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

Error.log nos erros fatais

Mensagem 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.
Responder