Page 1 of 1
Maldito GPF
Posted: Tue Jul 11, 2006 8:19 pm
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
Posted: Tue Jul 11, 2006 8:47 pm
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.
Posted: Wed Jul 12, 2006 12:15 pm
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
Posted: Wed Jul 12, 2006 1:50 pm
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.
Posted: Wed Jul 12, 2006 7:50 pm
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.
Posted: Fri Jul 14, 2006 12:03 pm
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:="
Posted: Fri Jul 14, 2006 1:34 pm
by Antonio Linares
Prueba a cambiar todos los _INT a LONG