Maldito GPF

Post Reply
Jorge Jaurena
Posts: 145
Joined: Fri Oct 21, 2005 6:35 pm

Maldito GPF

Post by Jorge Jaurena »

Hola a todos.

Alguien sabe a ciencia cierta lo que es un GPF?
Porque un mismo proceso da un GPF en una PC y en otra no?
Hay alguna bibliografia que ayude en esto?

Muchas gracias a todos
Jorge Jaurena
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Jorge,

Un GPF ("General protection fault") es un "error de protección general". Se produce cuando la aplicación invade una zona de memoria en la que no tiene autorización para entrar. Es una tecnología implementada a nivel de microprocesador para asegurar la robustez del sistema operativo y evitar la corrupción de la memoria.

En tu caso particular para saber por que te aparece hay que saber:

1. Que version/build de Harbour ó xHarbour estás usando ? Igual para FWH.

2. Puedes reproducir el GPF con un ejemplo ?

3. Te aparece un error en pantalla con una lista de las funciones llamadas ?

4. La primera posible solución es ir acotando zonas dentro del programa (usando diversos MsgInfo() por ejemplo) hasta localizar cual es la que genera el GPF.

5. Por último, se genera un fichero MAP con una opción del enlazador y se busca la dirección del GPF dentro de dicho fichero. Esa dirección indica la función que genera el GPF.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Jorge Jaurena
Posts: 145
Joined: Fri Oct 21, 2005 6:35 pm

Post by Jorge Jaurena »

1. Que version/build de Harbour ó xHarbour estás usando ? Igual para FWH.
Harbour 41.0 y FWH 2.4

2. Puedes reproducir el GPF con un ejemplo ?
Voy a intentarlo

3. Te aparece un error en pantalla con una lista de las funciones llamadas ?
Si, y me da un nro de linea, pero no se que corregir ya que en otras maquinas funciona correctamente.

4. La primera posible solución es ir acotando zonas dentro del programa (usando diversos MsgInfo() por ejemplo) hasta localizar cual es la que genera el GPF.
Intentare esto.

5. Por último, se genera un fichero MAP con una opción del enlazador y se busca la dirección del GPF dentro de dicho fichero. Esa dirección indica la función que genera el GPF.
Voy a buscar tambien aqui.

Consulta:
Puede ser que una version ilegal de windows genere este error, si hago que mi cliente compre las licencias, quizas el error desaparezca?

Muchas gracias.
Jorge Jaurena
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Jorge,

>> 3. Te aparece un error en pantalla con una lista de las funciones
>> llamadas ?
> Si, y me da un nro de linea, pero no se que corregir ya que en otras
> maquinas funciona correctamente.

Indica aqui que lista de funciones te aparece, y el número de línea.

> Puede ser que una version ilegal de windows genere este error, si hago > que mi cliente compre las licencias, quizas el error desaparezca?

No debería afectar, salvo que sea un windows modificado indebidamente.
regards, saludos

Antonio Linares
www.fivetechsoft.com
R.F.
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Post by R.F. »

Otra cosas que se me ocurre, que alguna vez me paso, es que si el programa corre bien en todos los equipos, exceptuando uno, es altamente probable que tengas un problema con algun SIMM de memoria.

Prueba cambiando la memoria del equipo con problemas.
Saludos
R.F.
Jorge Jaurena
Posts: 145
Joined: Fri Oct 21, 2005 6:35 pm

Post by Jorge Jaurena »

Rene, puede ser, pero me pasa en el mismo lugar en tres equipos que no muestran ninguna otra anomalia y en otros equipos funciona perfecto.

Este GPF se produce exactamente al intentar imprimir en una impresora fiscal (en Argentina son obligatorias), esto genera un log y me dicen los autores de la DLL que no encuentran ningun problema.

Pregunta: puede ser que las funciones de la DLL en vez de definir parametros como int haya que definirlos como long?
Aca copio el prg donde defino las funciones fiscales:
El error lo marca cuando ejecuta la funcion IItemFis() la cual llama a Enviar() y la cual llama a MandaPaqueteFiscal() que es la ultima que menciona el GPF y la cual reside dentro de la DLL.

Tengo la pantalla del error capturada, pero como puedo pegarla aca?

Desde ya muchas gracias por el interes en resolver esto

*** RUTINAS FISCALES ***

Function AbrePuerto(ComFiscal,Handler)
Local SetPr,ComF:=VAL(ComFiscal)
Handler:=OpenComFiscal(ComF)
SetPr :=SearchPrn(Handler)
Return nil

Function CierraPuerto(Handler)
CloseComFiscal(Handler)
Return nil

Function AbreTicket(Handler)
Local s
s:= "@" + Chr(28) + "T" + Chr(28) + "T"
Enviar(s,Handler)
Return nil

Function DatosCli(Nombre,Cui,TipoIVA,Domicilio,TipoDoc,TipoPrn,Texto,Handler)
/*
Nombre =Nombre del cliente
Cui =CUIT del cliente
TipoIva =Situacion de IVA del cliente
Domicilio=Domicilio del cliente
TipoDoc =Tipo de documento a abrir
CREDITO 'A' = R
CREDITO 'B' = S
REMITO = r
TipoPrn =Tipo de impresor fiscal (615,PR4,320)
Texto =Texto a emitir en Credito o Remito solo 320 (obligatorio)
*/

Local s

IF EMPTY(Nombre)
Nombre:="."
ENDIF
IF EMPTY(Cui)
Cui:="00000000000"
ENDIF
IF EMPTY(TipoIVA)
TipoIVA:="C"
ENDIF
IF EMPTY(Domicilio)
Domicilio:="."
ENDIF
IF EMPTY(Texto)
Texto:="."
ENDIF

IF TipoPrn="615" .OR. TipoPrn="715"
s:= "b" + Chr(28) + ALLTRIM(SUBSTR(Nombre,1,30)) + Chr(28) + Cui+ Chr(28)+;
TipoIVA + Chr(28) + "C"
ENDIF
IF TipoPrn="320" .OR. TipoPrn="425"
s:= "b" + Chr(28) + ALLTRIM(SUBSTR(Nombre,1,50)) + Chr(28) + Cui+ Chr(28)+;
TipoIVA + Chr(28) + "C" + Chr(28) + ALLTRIM(SUBSTR(Domicilio,1,50))
ENDIF
Enviar(s,Handler)

IF TipoDoc="A" .OR. TipoDoc="B"
s:= "@" + Chr(28) + TipoDoc + Chr(28) + "T"
Enviar(s,Handler)
ELSE
s:= "“" + Chr(28) + "1" + Chr(28) + Texto
Enviar(s,Handler)
s:= "€" + Chr(28) + TipoDoc + Chr(28) + "T"
Enviar(s,Handler)
ENDIF
Return nil

Function IItemFis(Texto,Cantidad,Monto,IVA,SumaResta,ImpInt,CalMonto,TipoDoc,TipFiscal,Handler)
/*
Texto ES EL TEXTO A IMPRIMIR EN EL ITEM (HASTA 20 CARACTERES) A
Cantidad ES LA CANTIDAD DEL ITEM (XXX.XXXXXXXXXX) N
Monto ES EL IMPORTE A EMITIR (+/- XXXXXX.XX) N
IVA ES LA TASA DE IVA UTILIZADA (XX.XX)/(**.**) N
SumaResta ES LA IMPUTACION (M=SUMA MONTO, m=RESTA MONTO) A
ImpInt ES EL COEFICIENTE DE IMPUESTOS INTERNOS (X.XXXXXXXX) N
CalMonto ES COMO SE CALIFICA EL MONTO (B=PRECIO BASE, T=PRECIO TOTAL) A
TipoDoc Si es factura o remito (R)
*/
Local s

IF TipoDoc<>"R"
IF TipFiscal="320"
s:= "B" + Chr(28) + SUBSTR(Texto,1,50) + Chr(28) + Cantidad + Chr(28)+;
Monto + Chr(28) + IVA + Chr(28) + SumaResta + Chr(28) + ImpInt +;
Chr(28) + "0" + Chr(28) + CalMonto
ENDIF
IF TipFiscal="615" .OR. TipFiscal="425"
s:= "B" + Chr(28) + SUBSTR(Texto,1,20) + Chr(28) + Cantidad + Chr(28)+;
Monto + Chr(28) + IVA + Chr(28) + SumaResta + Chr(28) + ImpInt +;
Chr(28) + "0" + Chr(28) + CalMonto
ENDIF
ELSE
s:= "‚" + Chr(28) + SUBSTR(Texto,1,108) + Chr(28) + Cantidad
ENDIF

Enviar(s,Handler)
Return nil

Function ITotalFis(Texto,Pagado,Operacion,Handler)
/*
Texto ES EL TEXTO A IMPRIMIR EN EL TOTAL (HASTA 30 CARACTERES) A
Pagado EL MONTO PAGADO POR EL CLIENTE (+/- XXXXXXXXX.XX) N
Operacion SI SE PONE C CANCELA EL COMPROBANTE, SI SE PONE T CALCULA
EL VUELTO EN FUNCION AL MONTO PAGADO A
*/
Local s
s:= "D" + Chr(28) + SUBSTR(Texto,1,30) + Chr(28) + Pagado + Chr(28) +;
Operacion + Chr(28) + "0"
Enviar(s,Handler)
Return nil

Function CierraFiscal(Handler)
Enviar("E",Handler)
Return nil

Function AbreNoFiscal(Handler)
Enviar("H",Handler)
Return nil

Function ITexNoFis(Texto,Handler)
Local s
s:= "I" + Chr(28) + substr(Texto,1,80) + Chr(28) + "0"
Enviar(s,Handler)
Return nil

Function AvanzaFis(Lineas,Handler)
Local s
s:= "P" + Chr(28) + Lineas
Enviar(s,Handler)
Return nil

Function CierraNoFis(Par,Handler)
// Par=Si cierro un no fiscal comun ("C"), si es homologado ("H")
Local s
IF Par<>"H"
s:="J"
ELSE
s:="
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Prueba a cambiar todos los _INT a LONG
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply