Página 1 de 1
ErroLog - Captura de variáveis
Enviado: 21 Mar 2014 18:31
por Hasse
Boa tarde meus colegas.
Estou tentando montar uma função de ErrorLog, mas a coisa não é fácil, e há poucos exemplos. A maioria só trata de setar os dados necessários para que um errorlog funcione.
Para começar, em todos os prg's de error que encontrei, nenhum deles aborda um código que faça o que estou procurando, ou seja, listar as variáveis que estão em uso no instante do erro.
No ambiente MiniGui isto não é possível ?
ErroLog - Captura de variáveis
Enviado: 21 Mar 2014 20:46
por Toledo
Amigo, todo controle de erro run time é feito pelo Harbour, então você pode usar qualquer comando do harbour (ou mesmo clipper, já que é compatível) para pegar estas variáveis. Na fonte do xhb da Contrib do Harbour tem o arquivo xhberr.prg que pega todas as variáveis que estão na memória, veja abaixo parte do xhberr.prg que faz isto:
Código: Selecionar todos
SAVE ALL Like * TO errormem
nMemHandle := FOpen( "errormem.mem", FO_READWRITE )
nMemLength := FSeek( nMemHandle, 0, FS_END )
FSeek( nMemHandle, 0 )
nCount := 1
WHILE FSeek( nMemHandle, 0, FS_RELATIVE ) + 1 < nMemLength
nMemWidth := Space( 18 )
FRead( nMemHandle, @nMemWidth, 18 )
cVarName := Left( nMemWidth, At( Chr( 0 ), nMemWidth ) - 1 )
cVarType := SubStr( nMemWidth, 12, 1 )
cVarRec := Bin2W( Right( nMemWidth, 2 ) )
nMemCount := iif( cVarType $ Chr( 195 ) + Chr( 204 ), 14 + cVarRec, 22 )
FSeek( nMemHandle, nMemCount, FS_RELATIVE )
cTemp := Left( cVarName + Space( 10 ), 10 )
cTemp += " TYPE " + Type( cVarName )
cTemp += " " + iif( Type( cVarName ) == "C", '"' + &cVarName + '"', strvalue( &cVarName ) )
nBytes := 0
SWITCH ValType( cVarName )
CASE "C"
nBytes += ( nLenTemp := Len( &cVarName ) )
EXIT
CASE "N"
nBytes += ( nLenTemp := 9 )
EXIT
CASE "L"
nBytes += ( nLenTemp := 2 )
EXIT
CASE "D"
nBytes += ( nLenTemp := 9 )
EXIT
ENDSWITCH
FWrite( nFhandle, " " + Transform( nLenTemp, "999999" ) + "bytes -> " )
FWriteLine( nHandle, " " + cTemp )
ENDDO
FClose( nMemHandle )
FErase( "errormem.mem" )
ATENÇÃO: o código acima é apenas uma parte do arquivo, então não é "compilável", servindo apenas para exemplo.
Abraços,
ErroLog - Captura de variáveis
Enviado: 21 Mar 2014 21:10
por alxsts
Olá!
No trecho de código mostrado, somente as variáveis public e private dos tipos de dados Character, Date, Logic e Numeric serão salvas, já que o comando SAVE é usado. Variáveis local e static ficarão de fora, assim como arrays e code blocks public e private...
ErroLog - Captura de variáveis
Enviado: 21 Mar 2014 22:23
por Hasse
Boa noite amigos.
Esta abertura foi muito boa. Encontrei alguns exemplos muito ricos, principalmente no tópico errorsys no Harbour.
Tenho um vasto material para estudar.
Obrigado.
ErroLog - Captura de variáveis
Enviado: 23 Mar 2014 17:01
por Hasse
Boa tarde a todos.
Estou quase terminando e está ficando com a cara desejada. Bem o quase é que é o problema....
Quando da captura das variáveis acontece que consigo recuperar o nome das variáveis (ex: c_Var1), mas quando tento recuperar o conteúdo dela (ex: &c_var1) a coisa não funciona.
Abaixo o código do trecho em questão:
Código: Selecionar todos
SAVE ALL Like * TO errormem
nMemHandle := FOpen( "errormem.mem", FO_READWRITE )
nMemLength := FSeek( nMemHandle, 0, FS_END )
FSeek( nMemHandle, 0 )
n_Count := 1
WHILE FSeek( nMemHandle, 0, 1 ) + 1 < nMemLength
nMemWidth := Space( 18 )
FRead( nMemHandle, @nMemWidth, 18 )
cVarName := Left( nMemWidth, At( Chr( 0 ), nMemWidth ) - 1 )
cVarType := SubStr( nMemWidth, 12, 1 )
cVarRec := Bin2W( Right( nMemWidth, 2 ) )
nMemCount := IIF( cVarType $ Chr( 195 ) + Chr( 204 ), 14 + cVarRec, 22 )
FSeek( nMemHandle, nMemCount, FS_RELATIVE )
nBytes := 0
*
c_Message += '1-' + cVarName + CRLF
c_Message += '2-' + Type( "cVarName" ) + CRLF
c_Message += '3-' + ValType( cVarName ) + CRLF
* c_Temp := StrValue( &cVarName )
* c_Message += StrValue( &cVarName )
* c_Message += " bytes : "
* c_Message += Left( cVarName + Space( 10 ), 10 )
* cTemp += ' '
* cTemp += ValType( cVarName )
* cTempo += ' '
* cTemp += strvalue( &cVarName )
* cTemp += " ValType " + ValType( cVarName )
* cTemp += " " + IIF( Type( cVarName ) == "C", '"' + &cVarName + '"', strvalue( &cVarName ) )
* c_Message += " VALTYPE " + ValType( cVarName )
* IF ValType( cVarName ) == "C"
* c_Message += '"' + ( cVarName ) + '"'
* ELSE
* c_Mesage += strvalue( &cVarName )
* ENDIF
* *
c_Message += CRLF
* SWITCH ValType( cVarName )
* CASE "C"
* nBytes += ( nLenTemp := Len( &cVarName ) )
* EXIT
* CASE "N"
* nBytes += ( nLenTemp := 9 )
* EXIT
* CASE "L"
* nBytes += ( nLenTemp := 2 )
* EXIT
* CASE "D"
* nBytes += ( nLenTemp := 9 )
* EXIT
* END
ENDDO
FClose( nMemHandle )
FErase( "errormem.mem" )
Observar que até onde inicia a parte comentada do código funciona corretamnente, mas basta descomentar a linha seguinte,
c_Temp := StrValue( &cVarName ), que busca recuperar o conteúdo da variável, a rotina deixa de funcionar e o aplicativo parece congelar e preciso fechá-lo no Gerenciador de Tarefas do Windows.
O que deve ser feito ?
ErroLog - Captura de variáveis
Enviado: 25 Mar 2014 10:27
por Hasse
Bom dia colegas.
Nenhuma idéia do que fazer ?
Será que não pode-se usar a funçao MemoRead() que funciona ?
O problema é que não sei como tratar o arquivo, já que a forma de funcionamento do FSeek() é muito diferente do HB_AT().
ErroLog - Captura de variáveis
Enviado: 31 Mar 2014 00:12
por Hasse
UFA....Consegui
Após 2 dias de trabalho duro, "pura queimação de Tico-e-Teco" consegui resolver todos os problemas da Captura das Variáveis.
Segue o código:
Código: Selecionar todos
SAVE ALL Like * TO errormem && Somente para variáveis PUBLIC e PRIVATE.
*------------------------------------------------------------------------------------------------------
*
nMemHandle := FOpen( "errormem.mem", FO_READWRITE )
nMemLength := FSeek( nMemHandle, 0, FS_END )
FSeek( nMemHandle, 0 )
n_Count := 0
*
c_Message += ' Tamanho Variável Tipo Valor' + CRLF
c_Message += ' --------------------------------------------' + CRLF
*
WHILE FSeek( nMemHandle, 0, 1 ) + 1 < nMemLength
n_Count ++
nMemWidth := Space( 18 )
FRead( nMemHandle, @nMemWidth, 18 )
cVarName := Left( nMemWidth, At( Chr( 0 ), nMemWidth ) - 1 )
cVarType := SubStr( nMemWidth, 12, 1 )
cVarRec := Bin2W( Right( nMemWidth, 2 ) )
nMemCount := IIF( cVarType $ Chr( 195 ) + Chr( 204 ), 14 + cVarRec, 22 )
FSeek( nMemHandle, nMemCount, FS_RELATIVE )
*
c_Tipo := Type( cVarName )
nBytes := 0
IF c_Tipo = "C"
nBytes += Len( &cVarName )
ELSEIF c_Tipo = "N"
c_Byte := AllTrim( ValToPrg( &cVarName ) ) && passa.
nBytes += Len( c_Byte )
ELSEIF c_Tipo = "L"
nBytes += ( 1 )
ELSEIF c_Tipo = "D"
c_Byte := DtoC( &cVarName ) && passa.
nBytes += Len( c_Byte )
ENDIF
*
c_Message += ' ' + Str( nBytes, 04, 00 ) + ' Bytes -> '
c_Message += PADR( cVarName, 13 ) + 'Tipo '
c_Message += Type( cVarName ) + ' = '
*
IF Type( cVarName ) $ "C"
c_Message += ValToPrg( &cVarName )
ELSEIF Type( cVarName ) = "L"
c_Message += ValToPrg( &cVarName )
ELSEIF Type( cVarName ) = "D"
c_Message += DtoC( &cVarName )
ELSEIF Type( cVarName ) = "N"
c_Message += AllTrim( Transform( &cVarName, '999999999' ) )
ELSE
c_Message += 'Indefinida'
ENDIF
c_Message += CRLF
*
ENDDO
Obrigado a todos que colaboraram.
RESOLVIDO...