Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   La Taberna (https://www.clubdelphi.com/foros/forumdisplay.php?f=40)
-   -   Cazando errores (https://www.clubdelphi.com/foros/showthread.php?t=55254)

Casimiro Notevi 11-04-2008 15:06:52

Cazando errores
 
Hola, pongo este mensaje en el foro de "La Taberna" porque lo hago como un comentario a los amigos, debido a que no sé si será publicidad, aunque creo que no, que es una utilidad estupenda para cualquier desarrollador Delphi.

La cosa es que ¿quién no se ha vuelto loco alguna vez buscando algún error que el depurador de Delphi no nos informa correctamente de cuál es el problema?.

Pues gracias a un estupendo programa que he conocido por el blog de "Delphi al límite" eso ya no será un problema. En una sola palabra: IMPRESIONANTE.

Os dejo el enlace y desde allí podéis ir a la página del fabricante, hay un video tutorial estupendo y ya me comentaréis si vale la pena o no. Yo ya lo he pedido a mis jefes, por si cuela :)

http://delphiallimite.blogspot.com/2...eurekalog.html

marcoszorrilla 11-04-2008 15:48:54

No creo que los jefes entren al trapo:
Cita:

Company License (unlimited developers) €449

Pero para un desarrollador autónomo:
Cita:

Single Developer License €149

No cabe duda que lo mejor es no equivocarse nunca, "como el Papa".

Un Saludo.

jcarteagaf 11-04-2008 16:01:56

Eurekalog
 
Es una excelente herramienta, la venimos usando desde la version 5.0

Los errores nos llegan al mail con toda la información que necesitamos para identificar el problema.

Es muy recomendable.

marcoszorrilla 11-04-2008 16:04:52

Sin embargo la opción del correo me parece extraordinaria.

Un Saludo.

Lepe 11-04-2008 16:06:21

Otra alternativa, con la JVCL, más concretamente con la JCL, que ya sabemos es gratuita.

En el primer Form o datamodule:
Código Delphi [-]

initialization
 //--------------------------------------------------------------------------------------------------
 // JclDebug initialization and finalization for VCL application
//--------------------------------------------------------------------------------------------------

   // Enable raw mode (default mode uses stack frames which aren't always generated by the compiler)
  Include(JclStackTrackingOptions, stRawMode);
  // Disable stack tracking in dynamically loaded modules (it makes stack tracking code a bit faster)
  Include(JclStackTrackingOptions, stStaticModuleList);

  // Initialize Exception tracking
  JclStartExceptionTracking;

finalization

  // Uninitialize Exception tracking
  JclStopExceptionTracking;

El resultado de una excepción, aunque se puede obtener más info, yo me contento con el Call Stack que lo envío a un archivo de texto. Aquí ves tooooooda la pila de llamadas desde que se inició la aplicación "MiPrograma.exe"
Código Delphi [-]
17:23:22:075 > 09/04/2008 17:23:22:075{--------------------------- INICIO DE SESION ---------------------------}
17:23:31:709 > ** EXCEPCION ** > SqlCode: -625  ClassName: EMDOFirebirdError
validation error for column IDCLIENTE, value "*** null ***"
Este mensaje anterior lo tengo en el Application.OnException


Stack :
[0052B51B] MDO.MDODataBaseError (Line 390, "MDO.pas" + 41) + $13
[005319D0] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1757, "MDOCustomDataSet.pas" + 6) + $2
[0053254E] MDOCustomDataSet.TMDOCustomDataSet.InternalGetFieldData (Line 2197, "MDOCustomDataSet.pas" + 30) + $F
[00531C0F] MDOCustomDataSet.TMDOCustomDataSet.GetFieldData (Line 1855, "MDOCustomDataSet.pas" + 8) + $7
[004ED335] DB.TDataSet.GetFieldData + $45
[004ED3F7] DB.TDataSet.GetFieldData + $107
[005319DC] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1759, "MDOCustomDataSet.pas" + 8) + $2
[0053254E] MDOCustomDataSet.TMDOCustomDataSet.InternalGetFieldData (Line 2197, "MDOCustomDataSet.pas" + 30) + $F
[005319D0] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1757, "MDOCustomDataSet.pas" + 6) + $2
[0053252A] MDOCustomDataSet.TMDOCustomDataSet.InternalGetFieldData (Line 2193, "MDOCustomDataSet.pas" + 26) + $D
[00531C0F] MDOCustomDataSet.TMDOCustomDataSet.GetFieldData (Line 1855, "MDOCustomDataSet.pas" + 8) + $7
[005319D0] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1757, "MDOCustomDataSet.pas" + 6) + $2
[0053252A] MDOCustomDataSet.TMDOCustomDataSet.InternalGetFieldData (Line 2193, "MDOCustomDataSet.pas" + 26) + $D
[00531C0F] MDOCustomDataSet.TMDOCustomDataSet.GetFieldData (Line 1855, "MDOCustomDataSet.pas" + 8) + $7
[004ED335] DB.TDataSet.GetFieldData + $45
[004ED3F7] DB.TDataSet.GetFieldData + $107
[00478AFF] Controls.TWinControl.DefaultHandler + $D7
[004759B0] Controls.TControl.WndProc + $188
[00478A1B] Controls.TWinControl.WndProc + $157
[0046B2B8] StdCtrls.TButtonControl.WndProc + $6C
[004A4BC4] JvExStdCtrls.TJvExButton.WndProc + $4E4
[004A4C00] JvExStdCtrls.TJvExButton.WndProc + $520
[0041FB48] Classes.TThreadList.UnlockList + $4
[004319C0] Graphics.FreeMemoryContexts + $98
[00478698] Controls.TWinControl.MainWndProc + $2C
[004786AD] Controls.TWinControl.MainWndProc + $41
[0042A648] Classes.StdWndProc + $14
[00478AFF] Controls.TWinControl.DefaultHandler + $D7
[004688AD] StdCtrls.TCustomEdit.DefaultHandler + $2D
[004759B0] Controls.TControl.WndProc + $188
[004A1FA0] JvExControls.TJvExCustomControl.WndProc + $4E4
[00478A1B] Controls.TWinControl.WndProc + $157
[0041FB48] Classes.TThreadList.UnlockList + $4
[004319C0] Graphics.FreeMemoryContexts + $98
[00478698] Controls.TWinControl.MainWndProc + $2C
[004786AD] Controls.TWinControl.MainWndProc + $41
[0042A648] Classes.StdWndProc + $14
[005319D0] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1757, "MDOCustomDataSet.pas" + 6) + $2
[0053252A] MDOCustomDataSet.TMDOCustomDataSet.InternalGetFieldData (Line 2193, "MDOCustomDataSet.pas" + 26) + $D
[00531C0F] MDOCustomDataSet.TMDOCustomDataSet.GetFieldData (Line 1855, "MDOCustomDataSet.pas" + 8) + $7
[004ED335] DB.TDataSet.GetFieldData + $45
[004ED3F7] DB.TDataSet.GetFieldData + $107
[0042A648] Classes.StdWndProc + $14
[00490732] Forms.Default + $3A
[0049095A] Forms.TCustomForm.ClientWndProc + $1D6
[00478A1B] Controls.TWinControl.WndProc + $157
[0041FB48] Classes.TThreadList.UnlockList + $4
[004319C0] Graphics.FreeMemoryContexts + $98
[00478698] Controls.TWinControl.MainWndProc + $2C
[004786AD] Controls.TWinControl.MainWndProc + $41
[0042A648] Classes.StdWndProc + $14
[005319D0] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1757, "MDOCustomDataSet.pas" + 6) + $2
[0053252A] MDOCustomDataSet.TMDOCustomDataSet.InternalGetFieldData (Line 2193, "MDOCustomDataSet.pas" + 26) + $D
[005319D0] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1757, "MDOCustomDataSet.pas" + 6) + $2
[0053252A] MDOCustomDataSet.TMDOCustomDataSet.InternalGetFieldData (Line 2193, "MDOCustomDataSet.pas" + 26) + $D
[00531C0F] MDOCustomDataSet.TMDOCustomDataSet.GetFieldData (Line 1855, "MDOCustomDataSet.pas" + 8) + $7
[004ED335] DB.TDataSet.GetFieldData + $45
[004ED3F7] DB.TDataSet.GetFieldData + $107
[00531C0F] MDOCustomDataSet.TMDOCustomDataSet.GetFieldData (Line 1855, "MDOCustomDataSet.pas" + 8) + $7
[004ED335] DB.TDataSet.GetFieldData + $45
[004ED3F7] DB.TDataSet.GetFieldData + $107
[00531C0F] MDOCustomDataSet.TMDOCustomDataSet.GetFieldData (Line 1855, "MDOCustomDataSet.pas" + 8) + $7
[004ED335] DB.TDataSet.GetFieldData + $45
[004ED3F7] DB.TDataSet.GetFieldData + $107
[00531C0F] MDOCustomDataSet.TMDOCustomDataSet.GetFieldData (Line 1855, "MDOCustomDataSet.pas" + 8) + $7
[004ED335] DB.TDataSet.GetFieldData + $45
[004ED3F7] DB.TDataSet.GetFieldData + $107
[005319D0] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1757, "MDOCustomDataSet.pas" + 6) + $2
[0053252A] MDOCustomDataSet.TMDOCustomDataSet.InternalGetFieldData (Line 2193, "MDOCustomDataSet.pas" + 26) + $D
[005319D0] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1757, "MDOCustomDataSet.pas" + 6) + $2
[0053252A] MDOCustomDataSet.TMDOCustomDataSet.InternalGetFieldData (Line 2193, "MDOCustomDataSet.pas" + 26) + $D
[004026E2] System.SysGetMem + $196
[004048F0] System.@TryFinallyExit + $10
[00402658] System.SysGetMem + $10C
[005319D0] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1757, "MDOCustomDataSet.pas" + 6) + $2
[00531C0F] MDOCustomDataSet.TMDOCustomDataSet.GetFieldData (Line 1855, "MDOCustomDataSet.pas" + 8) + $7
[005319D0] MDOCustomDataSet.TMDOCustomDataSet.GetActiveBuf (Line 1757, "MDOCustomDataSet.pas" + 6) + $2
[004ED335] DB.TDataSet.GetFieldData + $45
[004ED3F7] DB.TDataSet.GetFieldData + $107
[0047AE61] Controls.TWinControl.CMInvalidate + $9
[004759B0] Controls.TControl.WndProc + $188
[00478AFF] Controls.TWinControl.DefaultHandler + $D7
[004759B0] Controls.TControl.WndProc + $188
[00478A1B] Controls.TWinControl.WndProc + $157
[00478B19] Controls.TWinControl.DefaultHandler + $F1
[004906E1] Forms.TCustomForm.WndProc + $421
[00404FF3] System.@LStrFromPCharLen + $23
[00475780] Controls.TControl.Perform + $24
[00477BD6] Controls.TWinControl.GetControl + $32
[0047AEC7] Controls.TWinControl.CMInvalidate + $6F
[004759B0] Controls.TControl.WndProc + $188
[004026E2] System.SysGetMem + $196
[004048F0] System.@TryFinallyExit + $10
[004026B6] System.SysGetMem + $16A
[004EDC47] DB.TDataSet.IsLinkedTo + $2F
[004026E2] System.SysGetMem + $196
[004048F0] System.@TryFinallyExit + $10
[00402658] System.SysGetMem + $10C
[004026E2] System.SysGetMem + $196
[00478A1B] Controls.TWinControl.WndProc + $157
[004026B6] System.SysGetMem + $16A
[004A1770] JvExControls.TJvExCustomControl.BaseWndProc + $24
[004026E2] System.SysGetMem + $196
[004048F0] System.@TryFinallyExit + $10
[004026B6] System.SysGetMem + $16A
[00402891] System.SysFreeMem + $199
[00478A1B] Controls.TWinControl.WndProc + $157
[004A1FA0] JvExControls.TJvExCustomControl.WndProc + $4E4
[004A1FDC] JvExControls.TJvExCustomControl.WndProc + $520
[00404260] System.@CallDynaInst + $4
[00475780] Controls.TControl.Perform + $24
[004026E2] System.SysGetMem + $196
[004048F0] System.@TryFinallyExit + $10
[00402658] System.SysGetMem + $10C
[00402BAA] System.@GetMem + $A
[00404FB0] System.@NewAnsiString + $C
[00519AB0] JvDBLookup.TJvLookupControl.DataLinkRecordChanged (Line 941, "JvDBLookup.pas" + 8) + $1D
[004E96BE] DB.TDataLink.DataEvent + $72
[004F45B7] DBCtrls.TFieldDataLink.DataEvent + $F
[004E9C95] DB.TDataSource.NotifyLinkTypes + $3D
[004E9CC6] DB.TDataSource.NotifyDataLinks + $1E
[004E9CF3] DB.TDataSource.DataEvent + $23
[004EDF9C] DB.TDataSet.DataEvent + $130
[00536096] MDOCustomDataSet.TMDOCustomDataSet.WriteRecordCache (Line 3918, "MDOCustomDataSet.pas" + 5) + $19
[005344C2] MDOCustomDataSet.TMDOCustomDataSet.InternalSetFieldData (Line 3061, "MDOCustomDataSet.pas" + 53) + $8
[0053552C] MDOCustomDataSet.TMDOCustomDataSet.SetFieldData (Line 3611, "MDOCustomDataSet.pas" + 7) + $6
[004ED455] DB.TDataSet.SetFieldData + $45
[004ED4F6] DB.TDataSet.SetFieldData + $E6
[004ED335] DB.TDataSet.GetFieldData + $45
[004ED3F7] DB.TDataSet.GetFieldData + $107
[004ED335] DB.TDataSet.GetFieldData + $45
[004ED3F7] DB.TDataSet.GetFieldData + $107
[00490732] Forms.Default + $3A
[0049095A] Forms.TCustomForm.ClientWndProc + $1D6
[0042A648] Classes.StdWndProc + $14
[004024F2] System.TryHarder + $EE
[004026BF] System.SysGetMem + $173
[00402891] System.SysFreeMem + $199
[004028B9] System.SysFreeMem + $1C1
[00402BD5] System.@FreeMem + $5
[00404EFC] System.@LStrClr + $1C
[00404FF3] System.@LStrFromPCharLen + $23
[0040508A] System.@LStrFromPWCharLen + $4E
[00402BD5] System.@FreeMem + $5
[00404EFC] System.@LStrClr + $1C
[00404FF3] System.@LStrFromPCharLen + $23
[0040508A] System.@LStrFromPWCharLen + $4E
[0047B0EB] Controls.TWinControl.GetClientRect + $F
[0042E13E] Graphics.TCanvas.Unlock + $1E
[0045BDBC] ComCtrls.TToolBar.CNNotify + $5FC
[004026E2] System.SysGetMem + $196
[004048F0] System.@TryFinallyExit + $10
[004026B6] System.SysGetMem + $16A
[004759B0] Controls.TControl.WndProc + $188
[004688AD] StdCtrls.TCustomEdit.DefaultHandler + $2D
[004759B0] Controls.TControl.WndProc + $188
[0040B513] SysUtils.FmtStr + $B7
[0040B39F] SysUtils.FormatBuf + $367
[0047B0EB] Controls.TWinControl.GetClientRect + $F
[0042E13E] Graphics.TCanvas.Unlock + $1E
[0045BDBC] ComCtrls.TToolBar.CNNotify + $5FC
[004759B0] Controls.TControl.WndProc + $188
[0047B0EB] Controls.TWinControl.GetClientRect + $F
[0042E13E] Graphics.TCanvas.Unlock + $1E
[0045BDBC] ComCtrls.TToolBar.CNNotify + $5FC
[00491B4F] Forms.TCustomForm.DefaultHandler + $4B
[004795D9] Controls.TWinControl.WMSetCursor + $F5
[004759B0] Controls.TControl.WndProc + $188
[00492413] Forms.TCustomForm.WMEraseBkGnd + $1B
[004759B0] Controls.TControl.WndProc + $188
[00478A1B] Controls.TWinControl.WndProc + $157
[0042E13E] Graphics.TCanvas.Unlock + $1E
[004906E1] Forms.TCustomForm.WndProc + $421
[0041FB48] Classes.TThreadList.UnlockList + $4
[004319C0] Graphics.FreeMemoryContexts + $98
[00478698] Controls.TWinControl.MainWndProc + $2C
[004786AD] Controls.TWinControl.MainWndProc + $41
[0042A648] Classes.StdWndProc + $14
[0040B397] SysUtils.FormatBuf + $35F
[0040B39F] SysUtils.FormatBuf + $367
[004026E2] System.SysGetMem + $196
[004048F0] System.@TryFinallyExit + $10
[004026B6] System.SysGetMem + $16A
[00402BAA] System.@GetMem + $A
[00404FB0] System.@NewAnsiString + $C
[00404FF3] System.@LStrFromPCharLen + $23
[0040B513] SysUtils.FmtStr + $B7
[004759B0] Controls.TControl.WndProc + $188
[00492413] Forms.TCustomForm.WMEraseBkGnd + $1B
[004759B0] Controls.TControl.WndProc + $188
[0042A648] Classes.StdWndProc + $14
[00478A1B] Controls.TWinControl.WndProc + $157
[004906E1] Forms.TCustomForm.WndProc + $421
[0041FB48] Classes.TThreadList.UnlockList + $4
[004319C0] Graphics.FreeMemoryContexts + $98
[00478698] Controls.TWinControl.MainWndProc + $2C
[004786AD] Controls.TWinControl.MainWndProc + $41
[0042A648] Classes.StdWndProc + $14
[00478AFF] Controls.TWinControl.DefaultHandler + $D7
[0041DF6A] Classes.Rect + $1A
[00478E07] Controls.TWinControl.PaintControls + $14B
[00478C56] Controls.TWinControl.PaintHandler + $F2
[004A0397] JvThemes.FixedWMPrintClient (Line 1862, "JvThemes.pas" + 7) + $B
[004A03A9] JvThemes.FixedWMPrintClient (Line 1866, "JvThemes.pas" + 11) + $5
[0042A648] Classes.StdWndProc + $14
[004026E2] System.SysGetMem + $196
[004048F0] System.@TryFinallyExit + $10
[00402658] System.SysGetMem + $10C
[004026E2] System.SysGetMem + $196
[004048F0] System.@TryFinallyExit + $10
[004026B6] System.SysGetMem + $16A
[0053BF7A] MDOSQL.TMDOXSQLVAR.SetIsNull (Line 1321, "MDOSQL.pas" + 17) + $1A
[00402BFD] System.@ReallocMem + $D
[0052B2A8] MDO.MDOAlloc (Line 331, "MDO.pas" + 1) + $4
[004028B9] System.SysFreeMem + $1C1
[0054157E] MDODatabase.TMDOTransaction.CheckInTransaction (Line 1476, "MDODatabase.pas" + 3) + $2
[00541A69] MDODatabase.TMDOTransaction.GetDatabase (Line 1643, "MDODatabase.pas" + 1) + $8
[00541517] MDODatabase.TMDOTransaction.Call (Line 1463, "MDODatabase.pas" + 6) + $0
[0053CA9F] MDOSQL.TMDOSQL.Call (Line 1932, "MDOSQL.pas" + 3) + $C
[0053CE9F] MDOSQL.TMDOSQL.ExecQuery (Line 2049, "MDOSQL.pas" + 55) + $40
[00533AE5] MDOCustomDataSet.TMDOCustomDataSet.InternalPostRecord (Line 2819, "MDOCustomDataSet.pas" + 28) + $3
[0053393B] MDOCustomDataSet.TMDOCustomDataSet.InternalPost (Line 2774, "MDOCustomDataSet.pas" + 32) + $9
[004EF401] DB.TDataSet.CheckOperation + $29
[004EDF9C] DB.TDataSet.DataEvent + $130
[004EF0B3] DB.TDataSet.Post + $47
[00534AE8] MDOCustomDataSet.TMDOCustomDataSet.Post (Line 3242, "MDOCustomDataSet.pas" + 25) + $2
[004F6E31] DBCtrls.TDBNavigator.BtnClick + $F1
[004F6C85] DBCtrls.TDBNavigator.ClickHandler + $D
[00475B48] Controls.TControl.Click + $64
[004453D8] Buttons.TSpeedButton.Click + $0
[004453C2] Buttons.TSpeedButton.MouseUp + $E2
[004F738F] DBCtrls.TNavButton.MouseUp + $17
[00475F34] Controls.TControl.DoMouseUp + $2C
[00475FA9] Controls.TControl.WMLButtonUp + $69
[00475EC6] Controls.TControl.WMMouseMove + $6E
[004759B0] Controls.TControl.WndProc + $188
[00478A1B] Controls.TWinControl.WndProc + $157
[004906E1] Forms.TCustomForm.WndProc + $421
[00490732] Forms.Default + $3A
[00475780] Controls.TControl.Perform + $24
[004982A7] Forms.TApplication.DispatchAction + $7F
[004964B3] Forms.TApplication.WndProc + $46F
[0042A648] Classes.StdWndProc + $14
[00475780] Controls.TControl.Perform + $24
[004788B2] Controls.TWinControl.IsControlMouseMsg + $82
[0047899E] Controls.TWinControl.WndProc + $DA
[00478698] Controls.TWinControl.MainWndProc + $2C
[0042A648] Classes.StdWndProc + $14
[00493A8F] Forms.TraverseClients + $4F
[004357F2] Contnrs.TComponentList.GetItems + $A
[004979FD] Forms.TApplication.StopHintTimer + $15
[00496C77] Forms.TApplication.ProcessMessage + $83
[00496CAE] Forms.TApplication.HandleMessage + $A
[00496EDE] Forms.TApplication.Run + $96
[0064FC60] MiPrograma.MiPrograma(Line 66, "" + 5) + $7

¿No recuerdas el hilo "Debuguear en tiempo de ejecución"?.

Saludos

IVAND 30-06-2008 23:15:43

Buen programa parece estoy pensando en comprarlo solo una cosa porque el ejecutable se me duplica o incrementa su tamano hasta en un 65% mas al compilar con este programa

Lepe 01-07-2008 12:12:59

ya uses EurekaLog o la JVCL, se debe guardar en el ejecutable la información de depuración, para que al ejecutarse pueda crearse "un árbol" de las llamadas que se hacen.

Supongo que de ambas formas, al hacer un Build de tu proyecto se generará un archivo .map en la carpeta del programa, edítalo con el bloc de notas y verás más o menos lo que se guarda.

Saludos

IVAND 01-07-2008 16:51:57

Gracias por tu respuesta lepe

Entonces el crecimiento del ejecutable es inminente .... y entonces que puedo usar para compactar ese ejecutable pues mi aplicacion tiene 40 mb imaginense con eurekalog tendria como 100 mb algo medio pesado no creen ....


Gracias por sus consejos

Lepe 03-07-2008 20:33:49

Como suele decirse.... no se puede tener todo.

Lo mejor es trocear el ejecutable, bien creando dlls (ten a mano las aspirinas) o bien en bpl (Borland Package Library) en cuanto a dificultad, será menos lioso que las dlls, pero también tendrás que realizar muchas modificaciones al código, cargando los paquetes que requieras en cada momento y destruyendo de memoria los que desusas. Mira la ayuda y el foro de LoadPackage (creo recordar, si me equivoco, corríjanme).

De ambas formas el tamaño del ejecutable disminuye, la memoria RAM se usará de forma más eficiente, pero si tienes abiertas todas las ventanas de tu programa, por supuesto que ocupará los 40 o 100 megas en memoria.

La opción más rápida es marcar en Project -> Options la opcion de Build with runtime Package, verás que el ejecutable se reduce, pero tienes que distribuir con tu programa las bpls listadas en esa caja.

Saludos


La franja horaria es GMT +2. Ahora son las 03:29:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi