[Lazarus] heaptrc - Is it even worth using?
Lee Jenkins
lee at datatrakpos.com
Mon Oct 5 17:28:42 CEST 2009
Michael Van Canneyt wrote:
>
>
> On Mon, 5 Oct 2009, Lee Jenkins wrote:
>
>>
>> Does anyone else have any trouble reading heaptrc output? The only
>> thing that I can see of use is that it tells me there /is/ a leak.
>> However, trying to figure out where it is according to heaptrc output
>> seems more difficult and time consuming that searching through the code.
>>
>> I'm not criticizing per se, just frustrated that I've spend 40 mins
>> looking at a heaptrc output file with still no clue as to where the
>> leak may be.
>>
>> Heap dump by heaptrc unit
>> 4669 memory blocks allocated : 1093920/1110888
>> 4621 memory blocks freed : 1092756/1109608
>> 48 unfreed memory blocks : 1164
>> True heap size : 360448 (112 used in System startup)
>> True free heap : 355808
>> Should be : 356368
>> Call trace for block $030FFC70 size 45
>> $0040734F
>> $005E9916 TTIOIDGENERATORGUID__ASSIGNNEXTOID, line 489 of
>> M:/lazarus/components/tiOPF2/Core/tiOIDGUID.pas
>> $005CFA38 TTIOBJECT__CREATENEW, line 2036 of
>> M:/lazarus/components/tiOPF2/Core/tiObject.pas
>> $005CFAF5 TTIOBJECT__CREATENEW, line 2042 of
>> M:/lazarus/components/tiOPF2/Core/tiObject.pas
>> $004237AF TFLEXOBJECTMAPPING__REGISTERPROPERTY, line 259 of
>> M:/lazarus/projects/flexserver/src/flex_persistence.pas
>> $00423293 TMAPPINGREADER__REGISTERMAPPINGS, line 128 of
>> M:/lazarus/projects/flexserver/src/flex_mapping_reader.pas
>> $00422EBB TMAPPINGREADER__LOADMAPPINGS, line 66 of
>> M:/lazarus/projects/flexserver/src/flex_mapping_reader.pas
>> $00422C86 TFORM1__BUTTON1CLICK, line 40 of main_form.pas
>
> What is not clear about this ?
>
> In line 489 of M:/lazarus/components/tiOPF2/Core/tiOIDGUID.pas
> a memory block of 45 bytes is allocated and never freed.
>
> Michael.
First, thanks for responding so quickly, Michael. Secondly, my apologies as I
pasted the wrong output. The above was easy enough to find as I was not freeing
an object list that held the offending objects.
The output that I meant to paste is this:
M:\lazarus\projects\flexserver\gui_test\flexserver.exe
Heap dump by heaptrc unit
4669 memory blocks allocated : 1093938/1110912
4651 memory blocks freed : 1093626/1110576
18 unfreed memory blocks : 312
True heap size : 294912 (112 used in System startup)
True free heap : 293264
Should be : 293456
Call trace for block $03579D08 size 16
$0040D45B
$00439AB7
$00422EBB TMAPPINGREADER__LOADMAPPINGS, line 66 of
M:/lazarus/projects/flexserver/src/flex_mapping_reader.pas
$00422C86 TFORM1__BUTTON1CLICK, line 40 of main_form.pas
$004C0BB4 TCONTROL__CLICK, line 2227 of ./include/control.inc
$0050352F TBUTTONCONTROL__CLICK, line 72 of ./include/buttoncontrol.inc
$005039F5 TCUSTOMBUTTON__CLICK, line 164 of ./include/buttons.inc
$00503F51 TBUTTON__CLICK, line 331 of ./include/buttons.inc
Call trace for block $03579EE8 size 16
$0040A692
$0054783A
$00546A31
$00422EBB TMAPPINGREADER__LOADMAPPINGS, line 66 of
M:/lazarus/projects/flexserver/src/flex_mapping_reader.pas
$00422C86 TFORM1__BUTTON1CLICK, line 40 of main_form.pas
$004C0BB4 TCONTROL__CLICK, line 2227 of ./include/control.inc
$0050352F TBUTTONCONTROL__CLICK, line 72 of ./include/buttoncontrol.inc
$005039F5 TCUSTOMBUTTON__CLICK, line 164 of ./include/buttons.inc
Call trace for block $00157D08 size 20
$0040A692
$00546A31
$00422EBB TMAPPINGREADER__LOADMAPPINGS, line 66 of
M:/lazarus/projects/flexserver/src/flex_mapping_reader.pas
$00422C86 TFORM1__BUTTON1CLICK, line 40 of main_form.pas
$004C0BB4 TCONTROL__CLICK, line 2227 of ./include/control.inc
$0050352F TBUTTONCONTROL__CLICK, line 72 of ./include/buttoncontrol.inc
$005039F5 TCUSTOMBUTTON__CLICK, line 164 of ./include/buttons.inc
$00503F51 TBUTTON__CLICK, line 331 of ./include/buttons.inc
Call trace for block $03579DA8 size 16
$0040D45B
$00439AB7
$00422EBB TMAPPINGREADER__LOADMAPPINGS, line 66 of
M:/lazarus/projects/flexserver/src/flex_mapping_reader.pas
$00422C86 TFORM1__BUTTON1CLICK, line 40 of main_form.pas
$004C0BB4 TCONTROL__CLICK, line 2227 of ./include/control.inc
$0050352F TBUTTONCONTROL__CLICK, line 72 of ./include/buttoncontrol.inc
$005039F5 TCUSTOMBUTTON__CLICK, line 164 of ./include/buttons.inc
$00503F51 TBUTTON__CLICK, line 331 of ./include/buttons.inc
Call trace for block $03579D58 size 16
$0040A692
$0054783A
$00546A31
$00422EBB TMAPPINGREADER__LOADMAPPINGS, line 66 of
M:/lazarus/projects/flexserver/src/flex_mapping_reader.pas
$00422C86 TFORM1__BUTTON1CLICK, line 40 of main_form.pas
$004C0BB4 TCONTROL__CLICK, line 2227 of ./include/control.inc
$0050352F TBUTTONCONTROL__CLICK, line 72 of ./include/buttoncontrol.inc
$005039F5 TCUSTOMBUTTON__CLICK, line 164 of ./include/buttons.inc
//.. etc, etc.
As you can see, its the same thing, repeatedly and unfortunately, it doesn't
make any sense to me where the rest of execution is going. I am using
TXMLDocument in the "LoadMappings" method which is the only thing that I can
think of (code below).
Maybe its related to this?
http://bugs.freepascal.org/view.php?id=13605
The only thing is that I have updated my lazarus with a latter snapshot but I
guess it could be the same thing maybe.
My version is 9.27 rev. 21413 so it looks doubtful that is the problem but I
cannot say for sure.
procedure TMappingReader.RegisterMappings;
var
lNode: TDOMNode;
lAttr: TDOMAttr;
lRegs: TDomNode;
lCounter: integer;
lPropCounter: integer;
lRegItem: TDOMNode;
lObjReg: TFlexObjectMapping;
// intermediary vars to hold xml object properties
lClassName: string;
lDataTable: string;
lObjType: string;
lPK: boolean;
lPropName: string;
lColName: string;
lValType: string;
begin
if FXML = nil then
raise Exception.Create('XML DOM object is nil');
lRegs := FXML.DocumentElement.FindNode('registrations');
for lCounter := 0 to lRegs.ChildNodes.Length -1 do
begin
lRegItem := lRegs.ChildNodes[lCounter];
lClassName :=
lRegItem.Attributes.GetNamedItem('classname').FirstChild.NodeValue;
lDataTable :=
lRegItem.Attributes.GetNamedItem('tablename').FirstChild.NodeValue;
lObjType :=
lRegitem.Attributes.GetNamedItem('objecttype').FirstChild.NodeValue;
lObjReg := gMapppings.RegisterMapping(lClassName, lDataTable, lObjType);
with lObjReg do
begin
for lPropCounter := 0 to lRegItem.ChildNodes.Length - 1 do
begin
lNode := lRegItem.ChildNodes.Item[lPropCounter];
lpK :=
StrToBool(lNode.Attributes.GetNamedItem('pk').FirstChild.NodeValue);
lPropName :=
lNode.Attributes.GetNamedItem('propname').FirstChild.NodeValue;
lColName :=
lNode.Attributes.GetNamedItem('colname').FirstChild.NodeValue;
lValType :=
lNode.Attributes.GetNamedItem('valuetype').FirstChild.NodeValue;
//dtInteger, dtFloat, dtString, dtDateTime, dtBookean, dtBinary)
lObjReg.RegisterProperty(lPropName, lColName,
TFlexDataType(Integer(gDataTypeStrToInt(lValType))), lPK);
end;
end;
end;
end;
More information about the Lazarus
mailing list