我用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(第3943行,“jclDebug.pas”+7)+$1e
00119026 5:52:27.734[4496](003D496A)myapp.exe[007d596a]comleakhelper.tcomallocspy.debugstack(第46行,“comleakhelper.pas”+2)+9美元
00119027 5:52:27.734[4496](003D4B52)myapp.exe[007D5B52]comLeakHelper.tcomalLocSpy.prerealloc(第125行,“comLeakHelper.pas”+4)+2美元
00119028 5:52:27.734[4496](000053B6)myapp.exe[004063B6]系统。@wstrasg(第14090行,“sys\system.pas”+10)+$0
00119029 5:52:27.734[4496](002E4490)myapp.exe[006E5490]dbxcommon.tdbxcommand.settext(第5304行,“..\..\..\..\..\..\src\pas\dbx\driver\dbxcommon.pas”+13)+5美元
00119030 5:52:27.734[4496](0010A340)myapp.exe[0050B340]wideStrings.twideStrings.getValue(第580行,“common\wideStrings.pas”+3)+$D
00119031 5:52:27.734[4496](002e1afc)myapp.exe[006e2afc]dbxcommon.tdbxproperties.getValue(第4046行,“..\..\..\..\..\..\..\src\pas\dbx\driver\dbxcommon.pas”+1)+7美元
00119032 5:52:27.734[4496](002e3fc9)myapp.exe[006e4fc9]dbxcommon.tdbxconnectionex.getProductName(第5071行,“..\..\..\..\..\..\src\pas\dbx\driver\dbxcommon.pas”+1)+$E
00119033 5:52:27.734[4496](003765fa)myapp.exe[007775fa]sqlexpr.tsqlconnection.doconnect(第2467行,“..\..\..\..\..\..\src\pas\dbx\vcl\sqlexpr.pas”+66)+21美元
00119034 5:52:27.734[4496](0011876D)myapp.exe[0051976D]db.tcustomconnection.setconnected(行2628,“db.pas”+8)+4美元
00119035 5:52:27.734[4496](00118728)myapp.exe[00519728]db.tcustomconnection.open(第2611行,“db.pas”+0)+4美元
00119036 5:52:27.734[4496](00375d6f)myapp.exe[00776d6f]sqlexpr.tsqlconnection.checkconnection(第2302行,“..\..\..\..\..\src\pas\dbx\vcl\sqlexpr.pas”+4)+2美元
00119037 5:52:27.734[4496](00379241)myapp.exe[0077A241]sqlexpr.tcustomsqldataset.checkconnection(第3955行,“..\..\..\..\..\..\src\pas\dbx\vcl\sqlexpr.pas”+2)+2美元
00119038 5:52:27.734[4496](0037968A)myapp.exe[0077A68A]sqlexpr.tcustomsqldataset.opencursor(第4045行,“..\..\..\..\..\src\pas\dbx\vcl\sqlexpr.pas”+3)+4美元
00119039 5:52:27.734[4496](00125EA9)myapp.exe[00526EA9]db.tdataset.setactive(第9245行,“db.pas”+12)+7美元
00119040 5:52:27.734[4496](00125CA1)myapp.exe[00526CA1]db.tdataset.open(第9201行,“db.pas”+1)+6美元
…
< /代码>
所以,问题似乎出在数据库连接上。我正在使用Firebird 2.1、DBExpress和Interxpress,供来自上新世的Firebird驱动程序使用。
edit2:
这似乎分析了类似的问题,至少焦点与此处的线相同:http://www.yac.com.pl/mt.texts.sqlexpr-2.en.html>p每隔一段时间就增加几百兆字节,最终应用程序会冻结。应用程序是用Delphi编写的,它使用数据库、COM(用于OPC)和TCP/IP。
对于fastmm,我已经跟踪了内存使用的屏幕截图。我不完全确定该如何读取该表,但似乎有什么东西分配了296463552字节(0x100FB000,这是“幻数”?)三次。

有什么想法吗?有没有办法跟踪非delphi-mm内存分配?
我用的是Delphi2007和Fastmm4.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, "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
...
所以,问题似乎出在数据库连接上。我正在使用Firebird 2.1、DBExpress和Interxpress,为来自上新世的Firebird司机提供服务。
编辑2:
这似乎是在分析类似的问题,至少重点是同一行:http://www.yac.com.pl/mt.texts.sqlexpr-2.en.html