Página 1 de 2

Erro

Enviado: 08 Abr 2008 23:48
por José Luiz
Prezados colegas, tenho um sistema em clipper 5.2 rodando em rede com 12 computadores em windows xp. De repente o programa fecha em um computador sem deixar vestígios, mas continua funcionando nos outros. Não há mensagem de erro. Estou usando o tratamento de erros pcterror.prg, mas passa por ele sem deixar mensagem. Já aumentei o "file" o "buffers", porém sem resultado. Por onde devo começar para identificar o problema ?

Enviado: 09 Abr 2008 00:02
por Maligno
Apenas em um computador ou em qualquer computador? É sistemático ou acontece apenas de vez em quando?

Se o programa for executado por um atalho, pode estar ocorrendo um problema do tipo "Internal Error", cuja mensagem é curtinha e nem dá pra ver. Se for por um link, a janela DOS se fecha tão rápido que nada é percebido. Já vi esse filme várias vezes. Então, para inicialmente descartar essa possibilidade, abra um prompt do DOS e execute o programa na linha de comando até o momento dele abortar e veja se há alguma mensagem.

Boa idéia

Enviado: 09 Abr 2008 23:02
por José Luiz
Maligno, isso acontece algumas vezes ao dia em qualquer computador. Não há regra. Boa idéia de acessar o sistema no prompt do dos. Vou fazer isso nos computadores e esperar a mensagem. Obrigado.

Enviado: 09 Abr 2008 23:39
por alaminojunior
Tem também aquela questão do XP aceitar um número limitado de usuários, dê uma olhada.
Agora, pode ser também algum estouro de memória. Neste caso, inclua no seu código em lugares estratégicos (funções que usam muitas variáveis, savescreen´s, etc...), chamadas a função Memory() com o parametro "-1"
E também, pergunta: Qual o linkador vc usa ?

Enviado: 10 Abr 2008 05:04
por Maligno
Disparar o canhão pra qualquer lado causa desperdício e ainda se corre o risco de acertar o lugar errado. Melhor definir primeiro quem é o inimigo pra mandar bala no lugar certo. :)

Enviado: 10 Abr 2008 09:04
por alaminojunior
Claro que não precisa disparar todas as balas de uma vez ! Subentende-se o atirador não seja tão inexperiente.
Mas entendi o recado, e acho que a melhor coisa a fazer então é ficar quieto.

Enviado: 10 Abr 2008 13:45
por Maligno
Qualquer que seja a opinião é sempre melhor do que ficar quieto. Mas uma observação, mesmo metafórica, pode enriquecer a discussão. Nesse ponto, você tem meus agradecimentos.

O Erro

Enviado: 10 Abr 2008 23:05
por José Luiz
Uso ainda o rtlink. No prompt do dos surgiu o seguinte erro: Unrecoverable error 650: Processor stack fault.

Errorsys.prg

Enviado: 11 Abr 2008 01:34
por rochinha
Amiguinho

Este tipo de erro não apresenta uma linha nos .PRGs que possam nos dar uma alusão do ponto onde ocorre o mesmo.

- Pode estar relacionado ao uso de RTlink em sessões XP.
- Por se erro de procedencia externa pode ter sido provocado por DBF corrompido.
- stack fault nos leva a crer que o stack esta baixa para suprir a demanda de uso.

Se não me engano é possivel acrescentar ao CONFIG.SYS a linha STACKS e um valor que não me lembro, algo como STACKS=0,256(não me pergunte pois não uso mais)

O RTLink esta super ultrapassado em relação aos S.O.s que existem hoje, pois ele só conheceu o DOS e rodando seu aplicativo em um emulador DOS provavelmente este possa permitir esta ocorrencia de erro. O melhor seria voce começar a usar o Blinker, muito mais atual e com melhores controles de sessão DOS como memória, stack, etc.

Este erro não ocorre a qualquer hora e provavelmente, fazendo alguns testes em seu programa voce poderá chegar no modulo mais proximo onde o erro ocorre e portanto encontrar o que provoca o problema.

Acho até que a melhor solução é que seu sistema de erros deixasse de ser o padão do Clipper para usar um sistema de erros modificado com informações e verificações mais apresentaveis.

Código: Selecionar todos

/***
*       Errorsys.prg
*       Standard Clipper 5.0 error handler
*       Copyright (c) 1990 Nantucket Corp.  All rights reserved.
*
*       Compile:  /m/n/w
*/

#include "error.ch"


// put messages to STDERR
#command ? <list,...>   =>  ?? Chr(13) + Chr(10) ; ?? <list>
#command ?? <list,...>  =>  OutErr(<list>)

// used below
#define NTRIM(n)                ( LTrim(Str(n)) )

/***
*       ErrorSys()
*
*       Note:  automatically executes at startup
*/

proc ErrorSys()
     Private ErrorSys
     ErrorSys := 9876543210
     ErrorBlock( {|e| DefError(e)} )
return .t.

/***
*       DefError()
*/
static func DefError(e)
local i, cMessage, aOptions, nChoice, nCreate := 0

// by default, division by zero yields zero
if ( e:genCode == EG_ZERODIV )
   return (0)
end

// neste caso retorna sempre sem erro
if ( e:osCode = 5 )
   return (0)
end
if ( e:osCode >= 50 .and. e:osCode <= 55 )
   return (0)
end

// 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
end

// for lock error during APPEND BLANK, set NETERR() and subsystem default
if ( e:genCode == EG_APPENDLOCK .and. e:canDefault )
   NetErr(.t.)
   return (.f.)                                                                    // NOTE
end

// build error message
cMessage := ErrorMessage(e)

        // build options array
        // aOptions := {"Parar", "Sair"}
        aOptions := {"Sair"}

        if (e:canRetry)
           AAdd(aOptions, "Denovo") // return (.t.) 
        end

        if (e:canDefault)
           return (.f.) // AAdd(aOptions, "Padr„o")
        end

        // Dispositivo nao existente na rede
        if e:osCode = 5
           return (.t.)
        end
        if (e:osCode >= 50 .and. e:osCode <= 55)
           return (.t.)
        end

        // put up alert box
        nChoice := 0
        while ( nChoice == 0 )
                if ( Empty(e:osCode) )
                   nChoice := Alert( cMessage, aOptions )
                else
                   nChoice := Alert( cMessage + ;
                                                        DOSErro(e:osCode) , ;
                                                        aOptions )
                endif
                if ( nChoice == NIL )
                   exit
                endif
        end
        
        //if '1003' $ cMessage .or. 'Variavel nao encontrada' $ cMessage
        //   if Alert ( '!!! ATENCAO !!!;;' + ;
        //      'Um campo esta faltando na estrutura de uma tabela. Escolha a op‡„o necessaria para que o mesmo seja criado ou abandone e contacte o suporte.;'+ ;
        //      'Favor verificar antes de continuar!', {"Continua","Abandona"} ) = 1
        //      close databases
        //      CriArq('U')                                                
        //   endif
        //endif
        
        if ( !Empty(nChoice) )
                // do as instructed
                if     ( aOptions[nChoice] == "Parar" )
                        Close DataBases
                        Break(e)
                elseif ( aOptions[nChoice] == "Denovo" )
                        return (.t.)
                elseif ( aOptions[nChoice] == "Padr„o" )
                        return (.f.)
                end
        end

        // display message and traceback
        if ( !Empty(e:osCode) )
           cMessage += DOSErro( e:osCode )
        end

        i  := 2
        do while ( !Empty(ProcName(i)) )
           if procline(i) > 0
              LogSystem( Trim(ProcName(i)), cMessage, NTRIM(ProcLine(i)) )
              exit
           endif
           i++
        end
        ErrorLevel(1)
        quit

return (.f.)

/***
*       ErrorMessage()
*/
static func ErrorMessage(e)
local cMessage
        // start error message
        cMessage := if( e:severity > ES_WARNING, "Erro ", "Cuidado " )
        // add subsystem name if available
        if ( ValType(e:subsystem) == "C" )
                cMessage += e:subsystem()
        else
                cMessage += "???"
        end
        // add subsystem's error code if available
        if ( ValType(e:subCode) == "N" )
                cMessage += ("/" + NTRIM(e:subCode))
        else
                cMessage += "/???"
        end
        // add error description if available
        if ( ValType(e:description) == "C" )
           errdesc := alltrim( e:description )
           if     errdesc = 'Bound error'                  ; retry = .f. ; errdesc := 'Ultrapassou tamanho do vetor'
           elseif errdesc = 'Variable does not exist'      ; retry = .f. ; errdesc := 'Variavel nao encontrada'
           elseif errdesc = 'Argument error'               ; retry = .f. ; errdesc := 'Erro no argumento'
           elseif errdesc = 'Corruption detected'          ; retry = .f. ; errdesc := 'Arquivo corrompido'
           elseif errdesc = 'Alias does not exist'         ; retry = .f. ; errdesc := 'Arquivo nao esta em uso'
           elseif errdesc = 'Open error'                   ; retry = .f. ; errdesc := 'Erro de abertura do arquivo'
           elseif errdesc = 'Print error'                  ; retry = .t. ; errdesc := 'Impressora desligada ou desconectada'
           elseif errdesc = 'Workarea not in use'          ; retry = .t. ; errdesc := 'Area de trabalho nao aberta'
           elseif errdesc = 'Workarea not indexed'         ; retry = .t. ; errdesc := 'Area de trabalho sem indice('+dbf()+')'
           elseif errdesc = 'Limit exceeded'               ; retry = .t. ; errdesc := 'Limite ultrapassado'
           elseif errdesc = 'No exported variable'         ; retry = .t. ; errdesc := 'Variavel n„o export vel'
           elseif errdesc = 'No exported method'           ; retry = .t. ; errdesc := 'M‚todo n„o export vel'
           elseif errdesc = 'Data type error'              ; retry = .t. ; errdesc := 'Tipo de dado impr¢prio'
           elseif errdesc = 'Lock required'                ; retry = .t. ; errdesc := 'Travamento solicitado'
           elseif errdesc = 'Exclusive required'           ; retry = .t. ; errdesc := 'Exclusividade solicitada'
           elseif errdesc = 'Unrecoverable error'          ; retry = .t. ; errdesc := 'Erro inrecuper vel'
           elseif errdesc = 'Conventional memory exhausted'; retry = .t. ; errdesc := 'Sem mem¢ria Convencional'
           elseif errdesc = 'field numeric overflow'       ; retry = .f. ; errdesc := 'ultrapassado limite do campo num‚rico.'
           elseif errdesc = 'expression error'             ; retry = .f. ; errdesc := 'erro de express„o.'
           elseif errdesc = 'type mismatch'                ; retry = .f. ; errdesc := 'erro de tipo.'
           elseif errdesc = 'zero divide'                  ; retry = .f. ; errdesc := 'imposs¡vel divis„o por zero.'
           elseif errdesc = 'run error'                    ; retry = .t. ; errdesc := 'erro de execu‡„o de programa externo.'
           elseif errdesc = 'undefined identifier'         ; retry = .f. ; errdesc := 'identificador n„o foi definido pr‚viamente.'
           elseif errdesc = 'not an array'                 ; retry = .f. ; errdesc := 'n„o ‚ um array.'
           elseif errdesc = 'missing EXTERNAL'             ; retry = .f. ; errdesc := 'procedimento externo n„o foi encontrado.'
           endif
           cMessage += ("  " + errdesc ) // e:description)
        end
        // add either filename or operation
        if     ( !Empty(e:filename) )
               cMessage += (": " + e:filename)
        elseif ( !Empty(e:operation) )
               cMessage += (": " + e:operation)
        end
return (cMessage)

FUNCTION DOSErro( qual )
private FALHA[ 89 ]
if qual = 0 .or. qual > 89
   qual = 89
endif
FALHA[  1 ] = "Numero de funcao invalida"
FALHA[  2 ] = "ARQUIVO nao encontrado"
FALHA[  3 ] = "Path nao encontrado"
FALHA[  4 ] = "Muitos ARQUIVOs abertos"
FALHA[  5 ] = "Acesso negado"
FALHA[  6 ] = "HANDLE invalido"
FALHA[  7 ] = "Bloco de controle de memoria destruido"
FALHA[  8 ] = "Memoria insuficiente"
FALHA[  9 ] = "Endereco de bloco de memoria invalido"
FALHA[ 10 ] = "Dispositivo invalido"
FALHA[ 11 ] = "Formatacao invalida"
FALHA[ 12 ] = "Codigo de acesso invalido"
FALHA[ 13 ] = "Dados invalidos"
FALHA[ 14 ] = "Reservado"
FALHA[ 15 ] = "Acionador de disco invalido"
FALHA[ 16 ] = "Tentou remover do diretorio corrente"
FALHA[ 17 ] = "Dispositivo nao e o mesmo"
FALHA[ 18 ] = "Nao ha mais ARQUIVO"
FALHA[ 19 ] = "Disco protegido contra gravacao"
FALHA[ 20 ] = "Unidade de disco desconhecida"
FALHA[ 21 ] = "Impossivel leitura de disco"
FALHA[ 22 ] = "Comando desconhecido"
FALHA[ 23 ] = "Informacao errada"
FALHA[ 24 ] = "Comprimento da estrutura esta ruim"
FALHA[ 25 ] = "Erro na pesquisa"
FALHA[ 26 ] = "Unidade de armazenagem desconhecida"
FALHA[ 27 ] = "Setor nao encontrado"
FALHA[ 28 ] = "Papel de saida da impressora"
FALHA[ 29 ] = "Gravacao invalida"
FALHA[ 30 ] = "Leitura invalida"
FALHA[ 31 ] = "Falha geral"
FALHA[ 32 ] = "Violacao de divisao"
FALHA[ 33 ] = "Violacao de bloqueio"
FALHA[ 34 ] = "Mudanca de disco invalida"
FALHA[ 35 ] = "Ineficaz FCB"
FALHA[ 36 ] = "Reservado"
FALHA[ 37 ] = "Reservado"
FALHA[ 38 ] = "Reservado"
FALHA[ 39 ] = "Reservado"
FALHA[ 40 ] = "Reservado"
FALHA[ 41 ] = "Reservado"
FALHA[ 42 ] = "Reservado"
FALHA[ 43 ] = "Reservado"
FALHA[ 44 ] = "Reservado"
FALHA[ 45 ] = "Reservado"
FALHA[ 46 ] = "Reservado"
FALHA[ 47 ] = "Reservado"
FALHA[ 48 ] = "Reservado"
FALHA[ 49 ] = "Reservado"
FALHA[ 50 ] = "Nao suporta rede requerida"
FALHA[ 51 ] = "Nao suporta pedido da rede"
FALHA[ 52 ] = "Nome da rede duplicado"
FALHA[ 53 ] = "Nome da rede nao encontrado"
FALHA[ 54 ] = "Rede ativa"
FALHA[ 55 ] = "Dispositivo nao existente na rede"
FALHA[ 56 ] = "Limite de comandos da NETBIOS excedido"
FALHA[ 57 ] = "Erro no adaptador do hardware da rede"
FALHA[ 58 ] = "Resposta da rede incorreta"
FALHA[ 59 ] = "Erro inesperado na rede"
FALHA[ 60 ] = "Adaptador remoto imcompativel"
FALHA[ 61 ] = "Fila de impressao esta cheia"
FALHA[ 62 ] = "Fila de impressao esta cheia"
FALHA[ 63 ] = "ARQUIVO de impressao eliminado"
FALHA[ 64 ] = "Nome da rede eliminado"
FALHA[ 65 ] = "Acesso negado"
FALHA[ 66 ] = "Incorreto tipo de dispositivo da rede"
FALHA[ 67 ] = "Nome da rede nao encontrado"
FALHA[ 68 ] = "Limite excedido para o nome da rede"
FALHA[ 69 ] = "Limite de sessao do NETBIOS excedido"
FALHA[ 70 ] = "Pausa temporaria"
FALHA[ 71 ] = "Pedido de rede negado"
FALHA[ 72 ] = "Redirecionamento Impressora / disco pausado"
FALHA[ 73 ] = "Reservado"
FALHA[ 74 ] = "Reservado"
FALHA[ 75 ] = "Reservado"
FALHA[ 76 ] = "Reservado"
FALHA[ 77 ] = "Reservado"
FALHA[ 78 ] = "Reservado"
FALHA[ 79 ] = "Reservado"
FALHA[ 80 ] = "ARQUIVO ja existente"
FALHA[ 81 ] = "Reservado"
FALHA[ 82 ] = "Impossivel criar diretorio"
FALHA[ 83 ] = "Ocorreu falha em INT 24H"
FALHA[ 84 ] = "Muitos redirecionamentos"
FALHA[ 85 ] = "Redirecionamento duplicado"
FALHA[ 86 ] = "Senha invalida"
FALHA[ 87 ] = "Parametro invalido"
FALHA[ 88 ] = "Defeito no dispositivo da rede"
FALHA[ 89 ] = "Nenhum erro ocorrido !"
RETURN( ", "+FALHA[ qual ] )

FUNCTION LogSystem
PARAMETER name, info, line
ret_line := "chr(13)+chr(10)"
errfile  := "error.log"
IF !FILE(errfile)
   errhandle = FCREATE(errfile)
   FWRITE(errhandle,"Segue lista de erros ocorridos"+&ret_line.)
   FWRITE(errhandle,"pelo detector de erros System Error"+&ret_line.)
   FWRITE(errhandle,"Programa Utilit rio."+&ret_line.+&ret_line.)
   FWRITE(errhandle,"Erros: "+&ret_line.)
ELSE
   errhandle = FOPEN(errfile,1)
   length    = FSEEK(errhandle,0,2)
   FSEEK(errhandle,length)
ENDIF
FWRITE(errhandle,DTOC(DATE())+" "+TIME()+" Descoberto ("+info+")"+&ret_line.)
FWRITE(errhandle,"                              na linha "+line+" no m¢dulo "+name+"."+&ret_line.+&ret_line.)
FCLOSE(errhandle)
RETURN(.T.)

FUNCTION LogBackup( MINHA_INFO )
ret_line := "chr(13)+chr(10)"
errfile  := "backup.log"
IF !FILE(errfile)
   errhandle = FCREATE(errfile)
   FWRITE(errhandle,"Segue lista de processos detectados."+&ret_line.+&ret_line.)
   FWRITE(errhandle,"Data     Hora     Operador             Processo"+&ret_line.)
   FWRITE(errhandle,replicate("-",80)+&ret_line.+&ret_line.)
ELSE
   errhandle = FOPEN(errfile,1)
   length    = FSEEK(errhandle,0,2)
   FSEEK(errhandle,length)
ENDIF
FWRITE(errhandle,DTOC(DATE())+" "+TIME()+" "+M->OPERADOR+" "+MINHA_INFO+&ret_line.)
FCLOSE(errhandle)
//MEMOEDIT(10,10,20,70,MEMOREAD(errfile))
RETURN(.T.)

Re: O Erro

Enviado: 11 Abr 2008 05:15
por Maligno
José Luiz escreveu:Uso ainda o rtlink. No prompt do dos surgiu o seguinte erro: Unrecoverable error 650: Processor stack fault.
Então era bem o que eu imaginava. Uma mensagem curta e rápida, quase impossível de ler.

O Rochinha deu uma boa dica: trocar para o BLinker. Mas se ainda não quiser fazer isso, experimente usar o comando /STACK:<bytes> do próprio RTlink. É capaz de só isso já resolver o problema.

Enviado: 12 Abr 2008 12:16
por davidbezerra
eu to com o mesmo problema,
uso o clipper 5.3 e o blinker,
o erro e: DBEDSETUP (0) Unrecoverable error 667: Eval stack falt

ta linkando como segue a baixo:

BLINKER INCREMENTAL OFF
BLINKER CACHE EMS 30%,50%
BLINKER CACHE XMS 30%,50%
BLINKER EXECUTABLE CLIPPER //F:250 //DYNF:8
BLINKER PROCEDURE DEPTH 140
BLINKER EXECUTABLE NODELETE
BLINKER EXECUTABLE COMPRESS 1
BLINKER EXECUTABLE EXTENDED 4096
STACK 7068
MAP S,A

se voces poderem mim ajudar a descobrir onde esta o erro ficaria grato

Enviado: 12 Abr 2008 14:32
por sygecom
Olá David,
Qual versão do Blinker ?
Eu uso blinker 7.0 e com o script abaixo e nunca tive problemas:

Código: Selecionar todos

OutPut NomeExe
Blinker Incremental Off
Blinker Cache EMS 50%,50%
Blinker Cache XMS 50%,50%
Blinker Link EMS ON
Blinker Link XMS ON
Blinker Exec Clipper F=150
Blinker Exec Comp 1
Blinker Exec Exte
Blinker Memo Pack 60
Search BlxRatex
Search BlxClp53
Blinker Incr Pad 256
Blinker Over Page On
Blinker Over Opsi 60 

Enviado: 12 Abr 2008 16:07
por davidbezerra
uso o 7.0 tambem,

o erro ocorre esporádico e aleatoriamente, entre os micros da rede.

Enviado: 12 Abr 2008 16:23
por Maligno
Qual o maior valor de STACK que você testou?

Enviado: 15 Abr 2008 11:28
por davidbezerra
desculpe a demora de responder, e que tive que fazer uma viagem.

Maligno, eu to usando 7068.