Delphi / DBExpress发生内存泄漏
我的应用程序出现了一个奇怪的问题,它的内存使用量每次不止一次增加了几百兆,最终导致应用程序冻结。 该应用程序是用Delphi编写的,它使用数据库,COM(用于OPC)和TCP / IP。
随着FastMM,我已经有了内存使用的屏幕截图。 我不完全确定如何读取该表,但它看起来像分配了296463552个字节(0x100fb000,是“幻数”?)三次。
有任何想法吗? 有没有办法跟踪非Delphi-MM内存分配?
我正在使用Delphi 2007与FastMM 4.96。
编辑:
我使用IMallocSpy编写了一个小型助手类来跟踪COM内存分配情况。 以下是我得到的摘录:
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.@WStrAsg (Line 14090, "syssystem.pas" + 10) + $0
00119029 5:52:27.734 [4496] (002E4490){MyApp.exe} [006E5490] DBXCommon.TDBXCommand.SetText (Line 5304, "..........srcpasdbxdriverDBXCommon.pas" + 13) + $5
00119030 5:52:27.734 [4496] (0010A340){MyApp.exe} [0050B340] WideStrings.TWideStrings.GetValue (Line 580, "commonWideStrings.pas" + 3) + $D
00119031 5:52:27.734 [4496] (002E1AFC){MyApp.exe} [006E2AFC] DBXCommon.TDBXProperties.GetValue (Line 4046, "..........srcpasdbxdriverDBXCommon.pas" + 1) + $7
00119032 5:52:27.734 [4496] (002E3FC9){MyApp.exe} [006E4FC9] DBXCommon.TDBXConnectionEx.GetProductName (Line 5071, "..........srcpasdbxdriverDBXCommon.pas" + 1) + $E
00119033 5:52:27.734 [4496] (003765FA){MyApp.exe} [007775FA] SqlExpr.TSQLConnection.DoConnect (Line 2467, "..........srcpasdbxvclSqlExpr.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, "..........srcpasdbxvclSqlExpr.pas" + 4) + $2
00119037 5:52:27.734 [4496] (00379241){MyApp.exe} [0077A241] SqlExpr.TCustomSQLDataSet.CheckConnection (Line 3955, "..........srcpasdbxvclSqlExpr.pas" + 2) + $2
00119038 5:52:27.734 [4496] (0037968A){MyApp.exe} [0077A68A] SqlExpr.TCustomSQLDataSet.OpenCursor (Line 4045, "..........srcpasdbxvclSqlExpr.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
...
所以,这个问题似乎是在数据库连接。 我使用Firebird 2.1,DBExpress和InterXpress for Upscene的Firebird驱动程序。
编辑2:这似乎分析类似的问题,至少重点是在这里相同的行:http://www.yac.com.pl/mt.texts.sqlexpr-2.en.html
问题是Delphi 2007 DbExpress在多线程环境中出现问题(毕竟它不是线程安全的)。 更多信息在这里:http://www.yac.com.pl/mt.texts.sqlexpr-2.en.html
当您的应用程序被冻结时,您可以尝试查看堆栈以发现它被冻结的原因:http://code.google.com/p/asmprofiler/wiki/ProcessStackViewer
你可以试试memproof来跟踪所有的资源分配(及其堆栈跟踪):http://www.torry.net/tools/debug/memory/memp0948.zip
尝试EurekaLog查找问题。
链接地址: http://www.djcxy.com/p/3027.html