Página 1 de 5

Erro interno

Enviado: 14 Nov 2013 21:19
por cjp
Pessoal, tenho recebido com certa frequência a seguinte mensagem de erro em meus programas compilados com o Harbour:

Código: Selecionar todos

Application Internal Error - C:\tarefas\tar2p.exe Terminated at: 2013.11.14 20:23:38 Unrecoverable error 6005: Exception error: 

    Exception Code:C0000005
    Exception Address:00000000
    EAX:00C45F18  EBX:00C45F24  ECX:00C17EFC  EDX:0000000A
    ESI:00000005  EDI:00C1D6E4  EBP:0022FA9C
    CS:EIP:001B:00000000  SS:ESP:0023:0022F8EC
    DS:0023  ES:0023  FS:003B  GS:0000
    Flags:00010206
    CS:EIP:
    SS:ESP: 005368BF 00C45F24 00C1D6E4 00000000 00C45F24 00C1D6E4 00000080 00000005 000003EC 00C1D6D0 00000000 00000000 00C45F24 0022FA9C 0022F994 0000D112

    C stack:
    EIP:     EBP:       Frame: OldEBP, RetAddr, Params...
    00000000 0022FA9C   00C1D6E4 00000000 00000000 00000000 00C45F24 00000000 00000000 00000000 0052E943 00C45F24


Modules:
0x00400000 0x0025B000 C:\tarefas\tar2p.exe 0x7C900000 0x000B6000 C:\WINDOWS\system32\ntdll.dll 0x7C800000 0x00100000 C:\WINDOWS\system32\kernel32.dll 0x77F50000 0x000AB000 C:\WINDOWS\system32\ADVAPI32.DLL 0x77DB0000 0x00092000 C:\WINDOWS\system32\RPCRT4.dll 0x77F20000 0x00011000 C:\WINDOWS\system32\Secur32.dll 0x77E50000 0x00049000 C:\WINDOWS\system32\GDI32.dll 0x7E360000 0x00091000 C:\WINDOWS\system32\USER32.dll 0x77BF0000 0x00058000 C:\WINDOWS\system32\msvcrt.dll 0x774C0000 0x0013D000 C:\WINDOWS\system32\OLE32.dll 0x77100000 0x0008B000 C:\WINDOWS\system32\OLEAUT32.DLL 0x72FB0000 0x00026000 C:\WINDOWS\system32\WINSPOOL.DRV 0x71A70000 0x00017000 C:\WINDOWS\system32\WS2_32.dll 0x71A60000 0x00008000 C:\WINDOWS\system32\WS2HELP.dll 0x76360000 0x0001D000 C:\WINDOWS\system32\IMM32.DLL 0x77B20000 0x00022000 C:\WINDOWS\system32\Apphelp.dll 0x77BE0000 0x00008000 C:\WINDOWS\system32\VERSION.dll 0x71A10000 0x00040000 C:\WINDOWS\System32\mswsock.dll 0x76F00000 0x00027000 C:\WINDOWS\system32\DNSAPI.dll 0x76F90000 0x00008000 C:\WINDOWS\System32\winrnr.dll 0x76F40000 0x0002D000 C:\WINDOWS\system32\WLDAP32.dll 0x64000000 0x00021000 C:\Arquivos de programas\Bonjour\mdnsNSP.dll 0x76D40000 0x00019000 C:\WINDOWS\system32\Iphlpapi.dll 0x76FA0000 0x00006000 C:\WINDOWS\system32\rasadhlp.dll 0x60B30000 0x00058000 C:\WINDOWS\system32\hnetcfg.dll 0x71A50000 0x00008000 C:\WINDOWS\System32\wshtcpip.dll
Alguns já me disseram que isso seria problema do Harbour, e que eu deveria mudar para o xHarbour para isso não ocorrer mais. Será que é isso mesmo? Será que não tem outro jeito de resolver isso sem ter que voltar ao xHarbour?

Erro interno

Enviado: 14 Nov 2013 21:26
por alxsts
Olá!

Não creio que seja o caso de voltar para o xHarbour.

Talvez seja o caso de atualizar a versão do Harbour que você utiliza.

Forneça algumas informações adicionais:
- qual a versão do Harbour utilizada
- qual o compilador C utilizado e a versão (GCC, MingW...)
- sistema operacional (versão, se é 32 ou b4 bits...)

Erro interno

Enviado: 15 Nov 2013 01:22
por cjp
Eu uso o Harbour 3.0.

Não uso compilador C, compilo diretamente com o hbmk2.

No computador que estou usando agora, estou com o Win XP instalado. Mas também uso dois outros computadores com Win 7, ambos de 64 bits. O erro ocorre tanto nos meus computadores quanto no dos usuários, uns usando XP, outros Win 7 de 64 bits.

Erro interno

Enviado: 15 Nov 2013 01:51
por alxsts
Olá!
cjp escreveu:Não uso compilador C, compilo diretamente com o hbmk2.
Talvez você nunca tenha percebido mas usa um compilador C.

O HbMk2 lê um script de entrada e executa o Harbour. O Harbour, por sua vez, lê cada arquivo .PRG do script e o transforma em um arquivo .C. O compilador C (pode ser o BCC, MinGW, MSVC, Pelles ou GCC para Linux/Unix) lé o arquivo .C e cria um .OBJ. Depois o linkeditor lê os .OBJ, junta com as libs e gera o .EXE ou .DLL.

Eu insistiria em compilar o teu sistema com outra instalação do Harbour, para descartar a possibilidade de ser o Harbour ou o compilador C que o acompanha. Pesquisei esse erro na net e vi alguns casos de colegas que o receberam, ao usar HBIDE com QT. Acredito que não seja o teu caso.

Erro interno

Enviado: 15 Nov 2013 10:30
por cjp
De fato, não sabia que o hbmk2 usava um compilador C. Na verdade nem sei direito o que seria um compilador C.

Quando vc diz para compilar o meu sistema com outra instalação do Harbour, seria para eu usar versão diferente da que eu uso atualmente? Neste caso, qual seria a versão indicada? E de onde consigo baixá-la?

Erro interno

Enviado: 15 Nov 2013 11:30
por JoséQuintas
O Harbour tem versão nova todo dia, mas não precisa atualizar todo dia.
Se usa só a parte padrão do Harbour, baixe a versão de hoje, e pode ficar usando ela por um longo tempo, ou até o resto da vida.

Como encontrar?
Fácil:
vai no harbour-project.org
downloads
binaries windows
nightly

A versão nightly ("da noite") é a última versão com tudo que foi atualizado no dia anterior, pronta pra uso.

Importante:
O Harbour 3.0 é o pacote já fechado, contém não só o Harbour, mas bibliotecas adicionais, que não fazem parte do Harbour básico.
O Harbour nightly contém o Harbour básico, e as bibliotecas padrão, mas pronto pra uso.
Se usa a parte padrão, é suficiente pra trabalhar.
Se usa algo mais, aí vai precisar perguntar sobre o "algo mais" (gtqtc, cairo, libcurl, etc).
O resto pode ser adicionado depois, SE precisar.
No meu caso, o Harbour nightly é suficiente, e uso GTWVG, PDF, ZIP, etc.

Erro interno

Enviado: 15 Nov 2013 12:19
por cjp
Segui tuas instruções, parece que instalou a seguinte versão:

Código: Selecionar todos

Harbour Make (hbmk2) 3.2.0dev (r2013-11-08 16:08)
Copyright (c) 1999-2013, Viktor Szakáts
http://harbour-project.org/
Translation (pt-BR): Vailton Renato <vailtom@gmail.com>
Está correto?

Erro interno

Enviado: 15 Nov 2013 14:02
por JoséQuintas
Isso.
Está mostrando como Harbour 3.2, que é o mais recente.
E última alteração do Harbour 3.2 em 08/11/2013 (r2013-11-08)

Agora só usar.
A princípio só precisa do set path=c:\harbour\bin (a pasta bin de onde instalou o harbour)

Erro interno

Enviado: 15 Nov 2013 14:11
por cjp
Ok, já compilei o programa com ele. Por enquanto, não deu esse "erro interno". Vou testar mais. Obrigado por enquanto.

Erro interno

Enviado: 15 Nov 2013 22:50
por bencz
poderia tentar re-produzir este erro, em um pequeno código de exemplo ?

Erro interno

Enviado: 15 Nov 2013 23:13
por cjp
O problema é que o erro estava ocorrendo em pontos aleatórios do programa, sem que houvesse efetivamente erro no programa (até onde pude apurar). Pareceu-me algo como um "estouro de pilha". Quando dava o erro, aparecia o que eu postei no início deste post.

Por ora, não ocorreu mais. Se voltar a ocorrer (espero que não), eu posto novamente.

Erro interno

Enviado: 15 Nov 2013 23:15
por bencz
stack over flow é algo q pode acontecer nos programas harbour, pois, o código é compilado para funcionar com uma VM interna no harbour, provavelmente o GC do harbour está com falhas grandes, que teriam q ser corrigidas, ou, seu programa está com alguma falha, onde você se esquece de livrar alguma variavel que carrega uma carga grande de informações, ou, a memoria do seu computador está corrompida, algo do tipo....

Erro interno

Enviado: 15 Nov 2013 23:30
por cjp
Bom, neste caso, imagino que o problema possa ser no meu programa, por não liberação de variáveis, o que de fato não faço (e nem sei como fazer).

Tenho o grave defeito de trabalhar sempre com variáveis públicas. Estou corrigindo isso aos poucos, mas isso depende de reescrever várias partes do programa, por isso estou fazendo bem devagar.

Se o problema for realmente de uso de variáveis públicas, gostaria de saber: 1) como faço para liberar variáveis; 2) se existe um número fixo de variáveis públicas que podem ser usadas; 3) se existe algum jeito de saber de antemão quantas variáveis estão abertas.

Erro interno

Enviado: 16 Nov 2013 00:46
por bencz
Oque acontece, eu não sei exatamente como o harbour trata as variaveis publidas, mas, te garanto que elas consomem muita memoria.. pois vc acaba guardando alguma coisa la, e deixa la, e esquece da variavel
ou seja, isso vai causar um consumo de memoria gigantesco... o uso de variaveis STATIC ou GLOBAIS tem q ser muito bem calculado, para que não aconteça uma GRANDE M***A, entedes ?

Então, para você limpar uma variavel, você tem varias formas, uma das mais inteligentes e uteis, que eu conheço, é, igualar a variavel à NIL

exemplos:

Código: Selecionar todos

MINHA_VARIAVEL := NIL
Não existe um limite de variaveis publicas que você pode usar, o limite é a sua memoria...

Erro interno

Enviado: 16 Nov 2013 01:10
por bencz
cjp, reparei agora, qual é o código da exceção, bom, este código é sinal que seu programa está gravando informação na momoria, onde ele nao deveria entrar...

http://stackoverflow.com/questions/1716 ... 0005-in-vc