[Previous][Up] | Reference for unit 'heaptrc' (#rtl)

## HeapTrc Usage

All that you need to do is to include heaptrc in the uses clause of your program. Make sure that it is the first unit in the clause, otherwise memory allocated in initialization code of units that precede the heaptrc unit will not be accounted for, causing an incorrect memory usage report.

If you use the -gh switch, the compiler will insert the unit by itself, so you don't have to include it in your uses clause.

The below example shows how to use the heaptrc unit.

This is the memory dump shown when running this program in a standard way:

    Marked memory at 0040FA50 invalid
    Wrong size : 128 allocated 64 freed
      0x00408708
      0x0040CB49
      0x0040C481
    Call trace for block 0x0040FA50 size 128
      0x0040CB3D
      0x0040C481

If you use the lineinfo unit (or use the -gl switch) as well, then heaptrc will also give you the filenames and line-numbers of the procedures in the backtrace:

    Marked memory at 00410DA0 invalid
    Wrong size : 128 allocated 64 freed
      0x004094B8
      0x0040D8F9  main,  line 25 of heapex.pp
      0x0040D231
    Call trace for block 0x00410DA0 size 128
      0x0040D8ED  main,  line 23 of heapex.pp
      0x0040D231

If lines without filename/line-number occur, this means there is a unit which has no debug info included.

## Example

    Program heapex;

    { Program used to demonstrate the usage of heaptrc unit }

    Uses heaptrc;

    Var P1 : ^Longint;
        P2 : Pointer;
        I : longint;

    begin
      New(P1);
      // causes previous allocation not to be de-allocated
      New(P1);
      Dispose(P1);
      For I:=1 to 10 do
        begin
        GetMem (P2,128);
        // When I is even, deallocate block. We loose 5 times 128
        // bytes this way.
        If (I mod 2) = 0 Then FreeMem(P2,128);
        end;
      GetMem(P2,128);
      // This will provoke an error and a memory dump
      Freemem (P2,64);
    end.

Documentation generated on: Feb 26 2014