PDA

Ver la Versión Completa : Debugear en tiempo de ejecucion ?


ingel
05-10-2005, 16:50:28
es esto posible de alguna forma ? .. ( me comentan que en VB se puede hacer :D ) ..
o al menos saber cual fue la LINEA en la que se produjo el error..
porque lo mejor que he logrado obtener es el mensaje de error y el modulo en el que se produce... pero a veces no es muy precisa esa info para localizar/reproducir la situacion de error.

Saludos a todos y gracias
Ingel

vtdeleon
05-10-2005, 16:51:50
saludos

Podrías usar F7 o F8, linea por linea

dec
05-10-2005, 16:54:08
Hola,

Puedes establecer "puntos de ruptura", sencillamente, pulsando la tecla "F5" en la línea en que sea preciso. Luego puedes ir línea por línea con "F7", por ejemplo. Revisa el menú "Run" de Delphi y te toparás con distintas opciones para "debugear" tu programa. También echa un vistazo a las propias opciones del "debugger", en el menú "Tools -> Debugger options".

Ohcan
05-10-2005, 16:58:24
Hola Ingel

Nosotros usamos el EurekaLog (desgraciadamente es de pago).
Cuando la aplicación "casca" un error, sustituye al mensaje habitual por una ventana en la que, entre otras cosas (es configurable), te muestra el número de línea (y la unit, y por dónde viene...) en el que ha habido el problema.
Por si te interesa la web es www.eurekalog.com (¡qué originales! :D)

Saludos

ingel
05-10-2005, 17:06:53
yo no me referia debuguearlo desde el Delphi , sino SOLO ejecutando el el EXE desde una estacion de trabajo por ejemplo ..o por lo menos capturar la linea y .pas donde se produjo el error ..

Y a Ohcan , ahora 'chusmeo' un poco el eureka ...

GRACIAS...y saludos ..

Neftali [Germán.Estévez]
05-10-2005, 17:20:59
...yo no me referia debuguearlo desde el Delphi , sino SOLO ejecutando el el EXE desde una estacion de trabajo por ejemplo...
Lo puedes hacer con el mencionado EurekaLog o Similares; Yo, por ejempo uso ExceptionMagic (muy similar); También de pago...:(
http://www.dimusware.com/

delphi.com.ar
05-10-2005, 17:55:41
es esto posible de alguna forma ? .. ( me comentan que en VB se puede hacer :D ) ..
o al menos saber cual fue la LINEA en la que se produjo el error..

Dudo que puedas hacer eso en VB, no solo eso, sino que VB tiene su propia rutina de manejos de errores y no produce errores Win32 y es horrible. Esto hace muy difícil que un debugger externo se entere cuando se produce un error, y guardar toda la info de este, a menos que modifiques la librería de runtime msvbvm*.
Por otro lado recuerda que el código compilado no tiene referencia a la "Línea de Código" no compilado, a no ser que compiles el EXE con información de Debug. Lo que lo hace mucho mas extenso.

Te recomiendo probar esto que es gratuito, yo lo he utilizado sin problemas con aplicaciones en Delphi 7, y lo modifiqué a mi gusto sin problemas:
http://www.jirihajek.net/delphi/ExceptLog.htm


Saludos!

Lepe
05-10-2005, 20:14:19
Pues yo lo hago a través de la JVCL (componentes gratuitos) activando en las propiedades del proyecto la opción de menú "insert jclDebug".


00003: [18:52:55]Exception ENoResultSet: Error creating cursor handle
Exception
UnitName : DBTables
Procedure : TBDEDataSet.OpenCursor
Line : 4111 OffsetLine : 0
Deep of Except frame-dump : 7
UnitName : DBTables Procedure : TBDEDataSet.OpenCursor SourceName : DBTables.pas Line : 4112
UnitName : DB Procedure : TDataSet.SetActive SourceName : DB.pas Line : 8840
UnitName : SqlExplorer Procedure : TFRMSQL.btnAbrirClick SourceName : SqlExplorer.pas Line : 77
UnitName : SqlExplorer Procedure : TFRMSQL.btnAbrirClick SourceName : SqlExplorer.pas Line : 79
UnitName : Controls Procedure : TWinControl.MainWndProc SourceName : Controls.pas Line : 6137
UnitName : Controls Procedure : TWinControl.MainWndProc SourceName : Controls.pas Line : 6141


Un saludo

dec
06-10-2005, 02:45:40
Hola,

Lepe, muchas gracias por tu información, que me ha servido para probar el "JclDebug" e incluso implementarlo (a partir de uno de los ejemplos que se pueden encontrar) en XEditor (http://www.xeditor.tk). ¿Para qué demonios? Ahí está el caso. Este programa, cuando se produce una excepción, muestra al usuario un mensaje con la misma y le da la posibilidad de enviarme por correo un reporte de error.

Entonces, me he dicho, hombre, si añades la información del "JclDebug" el reporte de error contendrá bastante más información, que podrá resultar muy útil para tratar de solucionar posibles problemas en el programa. Y dicho y hecho, más o menos, he conseguido que el reporte incluya la información que puede proporcionar en caso de excepción el "JclDebug".

Ahora bien, parece ser que no puedo utilizar el compresor de ejecutables para comprimir el del programa susomentado, porque, entonces el "JclDebug" no funciona como debe y al producirse la excepción e intentar conseguir la información correspondiente se produce a su vez otra excepción y... para qué seguir. ;)

El programa ocupa ahora unos 3,44 MB, y comprimido se quedaba en menos de uno, pero, no es esto del todo importante, puesto que el programa instalador comprime el ejecutable (y el resto de archivos) sin que afecte al "JclDebug" y, al cabo, estamos hablando de que antes de implementar lo dicho el programa de instalación ocupaba unos 1,41 MB y ahora se quedaría en 1,95 MB.

Puesto que la ejecución del programa no se ve ralentizada (es aquello de que ahora, incluso, no es preciso descomprimir el ejecutable cada que se pone en marcha el programa) y al convencerme el asunto como para pensar en publicar el programa de este modo, asumiendo que no irá comprimido y que el asistente de instalación ocupará un poco más, me pregunto todavía...

¿Merece la pena el reporte de error? ¿Es necesario o puede ser útil cuando el programa ya se ha publicado, quiero decir, cara al usuario? ¿Debería usar el "JclDebug" únicamente cuando esté trabajando yo mismo en el programa y dejar de usarlo a la hora de publicar el mismo? ¿Puedes tú mismo o alguien que esto lea decirme algo que me aclare un poco estas dudas que tengo?

Muchas gracias de antemano. Si véis que me dejo algo en el tintero, me lo hacéis saber y veremos cómo hago para explicar lo que sea necesario explicar con más detalle. En todo caso, Lepe, gracias por la información, puesto que nada más sencillo que valerse uno del "JclDebug" (al menos para ciertas cosas, porque no es poco potente, a lo que se ve), sin olvidar el trabajo que les ha tenido que llevar a sus programadores el preparar algo así, claro está.

Lepe
06-10-2005, 11:06:20
Como en este hilo se daba información general, eso mismo hice yo.

Para el caso de jclDebug, ha de tenerse en cuenta 2 cosas:
- Hay que incluir en el primer formulario o Datamodule que crees el uses jclDebug, ya que realiza una inicialización en su unidad para empezar el "traceo" de excepciones.

- En la distribución de tu ejecutable, tienes que distribuir un archivo .map que se crea al compilar, (abrelo con el bloc de notas para saber de que hablo). En este caso se tiene que distribuir un par de megas más, pero perece la pena.

- Además de la información de jclDebug, se debe incluir las ventanas abiertas en tu aplicación (si son varias) para saber lo que hacia el usuario, (el objeto TScreen vale para eso).

-En cuanto al uso de compresores de ejecutables, acabo de probarlo, y efectivamente el compresor elimina la información de debug, por lo que interfiere con JCLDEBUG, como ya sabemos: no se puede tener todo :(.

Para el primer punto, yo me he construido mi propia jclDebug, que unicamente cambia los procedimientos por funciones y devuelve el error en una variable. Os lo dejo aqui:

(El nombre de la unidad lleva el prefijo LP (Lepe) para que no interfiera con posibles modificaciones de la JCL)

Saludos

{-----------------------------------------------------------------------------
Unit Name: lpJclDebug
Author: Lepe
Purpose: Tracear excepciones usando JclDebug.

- Project --> options --> INsert Jcl Debug
(Eso activará las opciones de project ->Options:
- Compiler -> Debugging todas marcadas excepto la ultima
- Linker -> Map file -> Detailed
)
- Poner esta unidad al principio de los uses del primer Formulario o datamodule.
- Usar un applicationEvents y en el evento ONException añadir:

ShowMessage(lpjcldebug.Error)

- solo se necesita acceder a esa variable, lo demás de esta unidad ni tocarlo.

History: Modificado para que sea una funcíón y devuelva el string con las
excepciones.
-----------------------------------------------------------------------------}


unit lpJclDebug;

interface
//procedure MyLogException(ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean);

{-----------------------------------------------------------------------------
Procedure: LogException
Author: Lepe
Date: 09-mar-2005
Arguments: ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean
Result: string
Devuelve un string con la traza de la excepcion.
-----------------------------------------------------------------------------}
function LogException(ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean):string;

procedure MyLogException(ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean);

var Error:string; // se tiene el error producido
var UseMaxDeep:Boolean; // usará una profundidad el doble de lo normal

implementation
uses
JclDebug, JclHookExcept, TypInfo, Classes,sysutils;

function LogException(ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean):string;
var
TmpS: string;
ModInfo: TJclLocationInfo;
I: Integer;
ExceptionHandled: Boolean;
HandlerLocation: Pointer;
ExceptFrame: TJclExceptFrame;
MaxDeep, idx:Integer;
Log:TStringList;

begin
log:= TStringList.Create;
try
Log.Clear;
MaxDeep:=0;
TmpS := 'Exception ' + ExceptObj.ClassName;
if ExceptObj is Exception then
TmpS := TmpS + ': ' + Exception(ExceptObj).Message;
if IsOS then
TmpS := TmpS + ' (OS Exception)';
Log.Add(TmpS);
ModInfo := GetLocationInfo(ExceptAddr);
idx:= Log.Add(Format(
'Exception '+ #13#10+
' UnitName : %s' +#13#10+
' Procedure : %s' +#13#10+
' Line : %d'+
' OffsetLine : %d',
[ModInfo.UnitName,
ModInfo.ProcedureName,
ModInfo.LineNumber,
modinfo.offsetfromlinenumber]));
Inc(MaxDeep);
if stExceptFrame in JclStackTrackingOptions then
begin
// added at the end Log.Add(' Except frame-dump:');
I := 0;
ExceptionHandled := False;
while (UseMaxDeep or not ExceptionHandled) and
(I < JclLastExceptFrameList.Count) do
begin
ExceptFrame := JclLastExceptFrameList.Items[I];
ExceptionHandled := ExceptFrame.HandlerInfo(ExceptObj, HandlerLocation);
if (ExceptFrame.FrameKind = efkFinally) or
(ExceptFrame.FrameKind = efkUnknown) or
not ExceptionHandled then
HandlerLocation := ExceptFrame.CodeLocation;
ModInfo := GetLocationInfo(HandlerLocation);
TmpS := Format(
' EXCFRAME $%p (TIPO %s',
[ExceptFrame.ExcFrame,
GetEnumName(TypeInfo(TExceptFrameKind), Ord(ExceptFrame.FrameKind))]);


if ExceptionHandled then
TmpS := TmpS + ', handles exception)'
else
TmpS := TmpS + ')';
// Log.Add(TmpS);
// if ExceptionHandled then
// Log.Add(Format(
// ' HANDLERLOCATION $%p',
// [HandlerLocation]))
// else
// Log.Add(Format(
// ' HANDLERLOCATION $%p',
// [HandlerLocation]));
Inc(MaxDeep);
Log.Add(STRINGofchar(' ',MaxDeep*2)+Format(
' UnitName : %s' +
' Procedure : %s' +
' SourceName : %s' +
' Line : %d',
[ModInfo.UnitName,
ModInfo.ProcedureName,
ModInfo.SourceName,
ModInfo.LineNumber]));
Inc(I);
// 'Exception '+ #13#10+
// ' UnitName : %s' +#13#10+
// ' Procedure : %s' +#13#10+
// ' SourceName : %s' +#13#10+
// ' Line : %d',

end;
end;
Log.Add('');
Log.Insert(idx+1,' Deep of Except frame-dump : '+IntToStr(MaxDeep));
finally
Result := Log.Text;
FreeAndNil(Log);
end;
end;

procedure MyLogException(ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean);
begin
Error := LogException(ExceptObj, ExceptAddr, IsOS);
end;

initialization
UseMaxDeep:= False;
JclAddExceptNotifier(MyLogException);

JclStackTrackingOptions := JclStackTrackingOptions + [stExceptFrame];
JclStartExceptionTracking;

finalization
JclRemoveExceptNotifier(MyLogException);
end.


saludos

dec
06-10-2005, 13:15:39
Hola,


En la distribución de tu ejecutable, tienes que distribuir un archivo .map que se crea al compilar, (...)

El caso es que obtengo los mismos resultados (tras probar con cierta excepción) tanto si el archivo "MAP" está junto al ejecutable como si no lo está... ¿me estoy perdiendo algo? Obviamente el archivo "MAP" contiene no poca información, entonces, ¿cómo es que obtengo los mismos resultados tanto si este archivo está disponible como si no lo está? ¿Tal vez se por el tipo de excepción conque estoy probando todo esto, que no precise de la información del archivo "MAP"? ;) Gracias Lepe por la información, en todo caso.

ingel
06-10-2005, 13:27:03
estoy buscandolos pero hasta ahora no los encuentro ..
y la ultima
Lepe: a que te refieres con lo de las ventanas abiertas ?

GRACIAS por tu ayuda
Ingel

dec
06-10-2005, 15:25:52
Hola,


estoy buscandolos pero hasta ahora no los encuentro ..

Si te refieres a la Jedi Library puedes encontrar esta en su página Web: Project JEDI (http://www.delphi-jedi.org/).

Lepe
06-10-2005, 16:58:12
Si tu programa tiene 60 o 70 ventanas y se produce una excepción del tipo '' is not a valid date... ¿En cual de las 70 ventanas se ha producido el error?.

Podríamos averiguarlo por el nombre de la unidad (UnitName del mensaje), pero también nos dá más información de los hábitos de ese usuario, es decir, si tiene varias ventanas de nuestro programa abiertas al mismo tiempo, o si abre una ventana, modifica lo que sea y la cierra; según los hábitos de los usuarios, podemos agilizar la apertura y cierre de las ventanas u otros detalles de nuestra aplicación.


El bucle sería algo así:

for i:= 0 to Screen.Count-1 do
Mensaje := Mensaje + Screen[i].ClassName + ' ' + Screen[i].Name + #10#13

ShowMessage (mensaje);


Ni que decir tiene que todo esto debe grabarse en un .txt o .log y al usuario solo indicarle que ha habido un error y se ha guardado la información de depuración.

Para el .log, ya que instalas la JVCL, tienes el TjvLogfile en la pestaña
"Jv Utils"

En cuanto a las preguntas de dec no puedo asegurar nada. Soy consciente de que en el .exe van algunos datos de la JCLdebug, tal y como dice la ventana que aparece tras hacer un Build Project estando activo el "insert jcl debug data", en mi caso, dice que el archivo .map son 3 megas, y la información de debug incluida en el .exe son 414 kb. No me queda claro si va todo en el exe o no.

Compilar sin información de debug y con información de debug si varía 400 kb en el tamaño del ejecutable.

saludos

saludos

dec
07-10-2005, 11:21:28
Hola,

Gracias Lepe, por todo. ;)

lento manu
10-10-2005, 18:48:42
Que corcholis, estoy intentando obtener resultados como los que menciona Lepe, pero no consigo ver esta tipo de info:


Exception
UnitName : DBTables
Procedure : TBDEDataSet.OpenCursor
Line : 4111 OffsetLine : 0
Deep of Except frame-dump : 7
UnitName : DBTables Procedure : TBDEDataSet.OpenCursor SourceName : DBTables.pas Line : 4112

La piedra filosofal es obtener el pas y la línea de código que produce el error, pero he implementado el pas que edita Lepe tam amablemente, lpJclDebug.pas, y obtengo el fichero map, una vez compilado el programa. Pero nada más.
¿Pero como puedo recoger los errores de ejecución?
¿Podrías ponernos un ejemplo Lepe, de cómo utilizarlo?, ¿cómo llamar a la funciónLogException(ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean):string y recoger el string en el map o en un .log con el TJvLogFile?
Gracias, profe... y perdona mi torpeza.

lento manu
10-10-2005, 21:43:38
Me voy a contestar a mi mismo, quizá para no darme vergüenza, ...pero alguien más puede caer. Me ha costado q en cupiera en la cabezota. Quizá por lo puramente simple.
Lepe: te mereces un altar, si me mandas una fotillo, así con un poco de aura, me la pego en el margen de mi pantalla.
Esto es alu cinate e im presionante, chicos (y todo en 2 palabras, ;-) )

procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
var I:integer;
begin
JvLogFile1.Add(lpJclDebug.Error);
Application.ShowException(E);
end; el resultado en el log:

[10/10/2005 21:29:46]Exception EAccessViolation: Access violation at address 00524D84 in module 'PbaDBX.exe'. Write of address 00000000 (OS Exception)
Exception
UnitName : Unit1
Procedure : TForm1.BotonErrorClick
Line : 210 OffsetLine : 4
Deep of Except frame-dump : 3
UnitName : Controls Procedure : TWinControl.MainWndProc SourceName : Line : 0
UnitName : Controls Procedure : TWinControl.MainWndProc SourceName : Line : 0
//Fin reporte// - ERROR
> Hace tiempo que no veía algo tan maravilloso.
...aaauuuuammmmm ...(te estoy cantando unos canticos) ...admirado y venerado Lepe.

vtdeleon
10-10-2005, 23:00:15
Saludos
Lepe: te mereces un altar, si me mandas una fotillo, así con un poco de aura, me la pego en el margen de mi pantalla.
Esto es alu cinate e im presionante, chicos (y todo en 2 palabras, ;-) )
Este hilo lo imprimí y ya lo guarde en mis documentos personales:D

Lepe
11-10-2005, 12:14:01
Los que de verdad tienen el mérito son los que empezaron a trabajar con su antecesor ,(que supongo era el mapFileSource), despues los de la JVCL se lo han currado hasta quedarse calvos, para que con un solo clic de ratón se añada toda esa info.

Yo lo único que he hecho es cambiar un procedure por un function.... y poco más. Así que no teneís que admirarme.... más bien hacer un depósito en mi cuenta corriente :D

Venga, un saludo compañeros.

ingel
13-10-2005, 17:39:05
Lepe , estoy tratando de seguir tus consejos ... y he llegado al punto de conseguir el log con el error , pero no me devuelve la linea , ni el pas donde se produjo .. talvez tenga que ver con el 'tipo de error' (ante la ignorancia , viene el delirio :D ), porque en los casos:

error 1: (producido con una query poniendo una instrucion SQL con error de sintacsis..al hacer el open da el error)

la info que me da es:

UNITNAME: dice OLEDBAccess en lugar de la unit que se produjo ...
Porcedure : ToleDbConnection.oledberror
Line : 0

y en los sucesivos Unitname ..( 2 en este caso ) todos line 0

-----

Caso error 2: (producido al pasar mal el valor de un parametro a un Store Procedure) de da :

Unitname : sysutils
prodecure : convertErrorFmt
Line : 0
y en los sucesivos Unitname ..en el tercero si me da una referencia al pas
uMain.pas Line : 2224 (que no es exactamente el ExecProc sino el showmessage del except del try del ExecProc )

-----------
este es el txt tectual del log:

[13/10/2005 12:14:08]Exception EMSError: Línea 1: sintaxis incorrecta cerca de 'fromm'.>
[13/10/2005 12:39:11]Exception EConvertError: ' ' no es un valor entero válido

Exception
UnitName : SysUtils
Procedure : ConvertErrorFmt
Line : 0 OffsetLine : 0
Deep of Except frame-dump : 5
UnitName : SysUtils Procedure : ConvertErrorFmt SourceName : Line : 0
UnitName : uMain Procedure : TMainMenu.Button1Click SourceName : uMain.pas Line : 2224
UnitName : Controls Procedure : TWinControl.MainWndProc SourceName : Line : 0
UnitName : Controls Procedure : TWinControl.MainWndProc SourceName : Line : 0
>

no se cuan lejos estare de que esto sea el log 'optimo y correcto'

Saludos y gracias
Ingel

Lepe
13-10-2005, 19:48:46
la info que me da es:

UNITNAME: dice OLEDBAccess en lugar de la unit que se produjo ...
Porcedure : ToleDbConnection.oledberror
Line : 0

En el primer formulario que crea en tu applicación ¿has puesto uses lpjcldebug
como primer uses de la ventana?

¿Seguro que has hecho un Build Project o Build All? Si no lo haces, no se genera de
nuevo el archivo .map, por tanto las referencias son las antiguas, basta que
hayas creado nuevos procedimientos para que no sea capaz de encontrar las
entradas en el .map


este es el txt tectual del log:

[13/10/2005 12:14:08]Exception EMSError: Línea 1: sintaxis incorrecta cerca de 'fromm'.>
[13/10/2005 12:39:11]Exception EConvertError: ' ' no es un valor entero válido

Exception
UnitName : SysUtils
Procedure : ConvertErrorFmt
Line : 0 OffsetLine : 0
Deep of Except frame-dump : 5
UnitName : SysUtils Procedure : ConvertErrorFmt SourceName : Line : 0

UnitName : uMain Procedure : TMainMenu.Button1Click SourceName : uMain.pas Line : 2224
UnitName : Controls Procedure : TWinControl.MainWndProc SourceName : Line : 0
UnitName : Controls Procedure : TWinControl.MainWndProc SourceName : Line : 0


El error que da al principio del texto es donde se hace un Raise
Exception.Create, o un simple Raise en bloques try...except. El
Frame-Dump es el volcado de llamadas que se han hecho anteriormente hasta
llegar al que levantó la excepción; en este caso se ha podido rastrear 5
llamadas, si tu error está 7 llamadas antes, no vas a poder identificar la linea
exacta (auque esto ocurre muy pocas veces ;))

Exception EConvertError: ' ' no es un valor entero válido

Esto significa que en Umain.pas linea 2224 estarás usando un
StrToInt(edit1.text), o algo similar, pero el usuario no ha escrito nada en
Edit1, Usa StrtointDef para pasar un valor por defecto.


Siempre vas a ver código de DB.pas, Sysutils.pas y similares, ya que es allí donde se levantan excepciones. Ahora te toca levantar tus propias excepciones:

try
Strtoint(edit1.text);
except
edit1.text:= '0';
Raise Exception.Create('Quillo no seas malo y mete un numero en el Edit1');
end;


saludos

ingel
14-10-2005, 14:00:55
Lepe , agradezco tu paciencia ...

necesito consultarte puntualmente :

1. El registro de los errores se generan siempre que se produce un error o
solo cuando se produce en una instruccion encerrada en un try /except ?

2. En el menu general del sistema que estoy modificando hay un procedure :

procedure TMainMenu.AppException(Sender: TObject; E: Exception);

y dentro de el se graba un log de errores (muy humilde :D ) .. pero mi duda
es si PASA POR AHI ..cada vez que se produce un error en CUALQUIER parte
del sistema .. o hay que poner el control de errores en cada Formulario.
(Lo que mas me interesa controlar son las grabaciones en la base de datos
que se hacen con Stores procedures)

3. Lo que me comentaste del control de las Ventanas ... donde iria ese codigo ?

4. el archvo log que se me genera es el siguiente:


[13/10/2005 12:14:08]Exception EMSError: Línea 1: sintaxis incorrecta cerca de 'fromm'.>
[13/10/2005 12:39:11]Exception EConvertError: ' ' no es un valor entero válido>
[14/10/2005 8:17:11]Exception EConvertError: ' ' no es un valor entero válido>
[14/10/2005 8:19:53]Exception EConvertError: ' ' no es un valor entero válido>
[14/10/2005 8:24:54]Exception EConvertError: ' ' no es un valor entero válido>
[14/10/2005 8:35:41]Exception EConvertError: ' ' no es un valor entero válido
Exception
UnitName : SysUtils
Procedure : ConvertErrorFmt
Line : 0 OffsetLine : 0
Deep of Except frame-dump : 5
UnitName : SysUtils Procedure : ConvertErrorFmt SourceName : Line : 0
UnitName : uAbmCreditos Procedure : TFAbmCreditos.Button1Click SourceName : uAbmCreditos.pas Line : 989
UnitName : Controls Procedure : TWinControl.MainWndProc SourceName : Line : 0
UnitName : Controls Procedure : TWinControl.MainWndProc SourceName : Line : 0


y aca van 2 preguntillas...
como veras luego de Exception ... no me da info del PAS , ni la linea donde se produce el error (Line : 0 OffsetLine : 0)
es esto correcto ?..me da la linea en el frame-dump , pero solo una , el resto esta en 0 cero.

- y la otra .. me deja registrado el detalle de la ULTIMA exepcion ..las 5 primeras solo me queda [13/10/2005 12:14:08] ....
debo tener algun error al grabar el log?

un saludo , no te atormento mas ........por un rato :D

Lepe
14-10-2005, 16:05:34
1. El registro de los errores se generan siempre que se produce un error o
solo cuando se produce en una instruccion encerrada en un try /except ?

La respuesta es bastante amplia, te aconsejo que busques en estos foros por
"la cara oculta de delphi 4 ", en ese libro se explica como trabajar con las
excepciones, y en el foro hay muchas preguntas sobre este tema (nada más
tienes que buscar por "Exception"). Como comprenderás es necesario saber
qué es una Excepción, como se produce, y que hace, para despues entender
como capturarlas y manejarlas.


2. En el menu general del sistema que estoy modificando hay un procedure :

procedure TMainMenu.AppException(Sender: TObject; E: Exception);

y dentro de el se graba un log de errores (muy humilde :D ) .. pero mi duda
es si PASA POR AHI ..cada vez que se produce un error en CUALQUIER parte
del sistema .. o hay que poner el control de errores en cada Formulario.
(Lo que mas me interesa controlar son las grabaciones en la base de datos
que se hacen con Stores procedures)

Sin duda has querido decir TApplicationEvents ya que un MainMenu no tiene
la opción de Excepciones.

Si no hay try... except en ninguna rutina, la excepción llegará al Objeto
Application. Si hay try ... except, debes entender la palabra reservada
Raise; qué hace y si conviene usarla.

. Lo que me comentaste del control de las Ventanas ... donde iria ese codigo ?

Básicamente en el ApplicationEvents en el evento OnException, o donde
quiera que se produzca una excepción que no se controle con Raise;

4. el archvo log que se me genera es el siguiente:

y aca van 2 preguntillas...
como veras luego de Exception ... no me da info del PAS , ni la linea donde se produce el error (Line : 0 OffsetLine : 0)
es esto correcto ?..me da la linea en el frame-dump , pero solo una , el resto esta en 0 cero.


Yo no he creado el JCLDEBUG :D, así que no puedo contestarte. Lo que sí
puedo decir es que algunas veces tambien obtengo esos resultados. Pero
obviamente, el error lo tienes en TFAbmCreditos.Button1Click, y jclDebug te lo está diciendo.


- y la otra .. me deja registrado el detalle de la ULTIMA exepcion ..las 5 primeras solo me queda [13/10/2005 12:14:08] ....
debo tener algun error al grabar el log?

Utiliza siempre un Build Project en lugar de compilar. Esa situación jamás la he visto.

Que conste que no te estoy dando "largas", simplemente te toca a ti, buscar, leer, entender, comprobar y practicar. Es la única forma de aprender.

saludos

Lepe
12-05-2006, 19:23:13
Reabro este hilo solo para comentar un detalle solicitado por Dec Según la documentación de la JVCL 3, el archivo .map puede borrarse despues de hacer el "Buid Project", en el exe se incluye la información de depuración.

Saludos