2010-09-28 10 views
7

Tengo un problema extraño con mi aplicación, su uso de memoria aumenta unos cientos de megabytes a la vez de vez en cuando y, finalmente, la aplicación se congela. La aplicación está escrita con Delphi, usa la base de datos, COM (para OPC) y TCP/IP.Fuga de memoria con Delphi/DBExpress

Con FastMM he seguido la captura de pantalla del uso de la memoria. No estoy seguro de cómo leer esa tabla, pero parece que algo ha asignado 296463552 bytes (0x100fb000, ¿es ese "número mágico"?) Tres veces.

memory usage

¿Alguna idea? ¿Hay alguna forma de rastrear asignaciones de memoria que no sean Delphi-MM?

Estoy usando Delphi 2007 con FastMM 4.96.

Editar:

escribí una pequeña clase de ayuda utilizando IMallocSpy para rastrear las asignaciones de memoria COM. Aquí está el extracto de lo que obtuve:

00119023 5:52:27.484 [4496] TCOMAllocSpy.PreRealloc size: 269462304 
00119024 5:52:27.734 [4496] (0002760C){ntdll.dll } [7C82860C] KiFastSystemCallRet + $0 
00119025 5:52:27.734 [4496] (0009F83A){MyApp.exe} [004A083A] JclDebug.JclCreateThreadStackTrace (Line 3943, "JclDebug.pas" + 7) + $1E 
00119026 5:52:27.734 [4496] (003D496A){MyApp.exe} [007D596A] ComLeakHelper.TCOMAllocSpy.DebugStack (Line 46, "ComLeakHelper.pas" + 2) + $9 
00119027 5:52:27.734 [4496] (003D4B52){MyApp.exe} [007D5B52] ComLeakHelper.TCOMAllocSpy.PreRealloc (Line 125, "ComLeakHelper.pas" + 4) + $2 
00119028 5:52:27.734 [4496] (000053B6){MyApp.exe} [004063B6] System.[email protected] (Line 14090, "sys\system.pas" + 10) + $0 
00119029 5:52:27.734 [4496] (002E4490){MyApp.exe} [006E5490] DBXCommon.TDBXCommand.SetText (Line 5304, "..\..\..\..\..\src\pas\dbx\driver\DBXCommon.pas" + 13) + $5 
00119030 5:52:27.734 [4496] (0010A340){MyApp.exe} [0050B340] WideStrings.TWideStrings.GetValue (Line 580, "common\WideStrings.pas" + 3) + $D 
00119031 5:52:27.734 [4496] (002E1AFC){MyApp.exe} [006E2AFC] DBXCommon.TDBXProperties.GetValue (Line 4046, "..\..\..\..\..\src\pas\dbx\driver\DBXCommon.pas" + 1) + $7 
00119032 5:52:27.734 [4496] (002E3FC9){MyApp.exe} [006E4FC9] DBXCommon.TDBXConnectionEx.GetProductName (Line 5071, "..\..\..\..\..\src\pas\dbx\driver\DBXCommon.pas" + 1) + $E 
00119033 5:52:27.734 [4496] (003765FA){MyApp.exe} [007775FA] SqlExpr.TSQLConnection.DoConnect (Line 2467, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 66) + $21 
00119034 5:52:27.734 [4496] (0011876D){MyApp.exe} [0051976D] DB.TCustomConnection.SetConnected (Line 2628, "DB.pas" + 8) + $4 
00119035 5:52:27.734 [4496] (00118728){MyApp.exe} [00519728] DB.TCustomConnection.Open (Line 2611, "DB.pas" + 0) + $4 
00119036 5:52:27.734 [4496] (00375D6F){MyApp.exe} [00776D6F] SqlExpr.TSQLConnection.CheckConnection (Line 2302, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 4) + $2 
00119037 5:52:27.734 [4496] (00379241){MyApp.exe} [0077A241] SqlExpr.TCustomSQLDataSet.CheckConnection (Line 3955, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 2) + $2 
00119038 5:52:27.734 [4496] (0037968A){MyApp.exe} [0077A68A] SqlExpr.TCustomSQLDataSet.OpenCursor (Line 4045, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 3) + $4 
00119039 5:52:27.734 [4496] (00125EA9){MyApp.exe} [00526EA9] DB.TDataSet.SetActive (Line 9245, "DB.pas" + 12) + $7 
00119040 5:52:27.734 [4496] (00125CA1){MyApp.exe} [00526CA1] DB.TDataSet.Open (Line 9201, "DB.pas" + 1) + $6 
... 

Por lo tanto, el problema parece ser la conexión a la base de datos. Estoy usando los controladores Firebird 2.1, DBExpress e InterXpress for Firebird de Upscene.

Edit2: Esto parece analizar problema similar, al menos, la atención se centra en mismas líneas que aquí: http://www.yac.com.pl/mt.texts.sqlexpr-2.en.html

+0

Puede probar si VMMap de sysinternals le da más información, pero una manera segura de rastrear esto sería usar procdump (desde sysinternals). Haga que cree automáticamente un archivo de volcado cuando se exceda un límite de memoria y analice el volcado con WinDbg. –

+0

VMMap dio básicamente la misma información, hay uno (o más) bloque grande asignado. No ayuda encontrar la fuente de la fuga – Harriv

+0

FastMM 4.90 tiene una función 'AllocateLargeBlock'. Trataría de colocar un punto de interrupción condicional aquí en un tamaño lo suficientemente grande. –

Respuesta

0

Trate de localizar EurekaLog el problema.

+0

Consulte mi comentario a André, lo mismo se aplica a EurekaLog y a la detección de fugas integradas FastMM, ya que la asignación de memoria no se realiza a través del administrador de memoria Delphi (= FastMM). – Harriv

+0

Y sí, estoy ejecutando EurekaLog :) – Harriv