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
Maldito GPF
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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.
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.
-
- Posts: 145
- Joined: Fri Oct 21, 2005 6:35 pm
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
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
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.
>> 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.
-
- Posts: 145
- Joined: Fri Oct 21, 2005 6:35 pm
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:="
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:="
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact: