mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-27 21:33:48 +02:00
154 lines
3.7 KiB
PHP
154 lines
3.7 KiB
PHP
{%MainUnit memcheck.pas}
|
|
|
|
{$IFDEF MC_Interface}
|
|
|
|
{$R-}
|
|
{$S-}
|
|
|
|
var
|
|
ExceptOnError: boolean = true;
|
|
|
|
procedure CheckHeap;
|
|
procedure CheckHeap(const txt: ansistring);
|
|
procedure CheckHeapWrtMemCnt(const txt: ansistring);
|
|
procedure WriteGetMemCount(const txt: ansistring);
|
|
|
|
function MemCheck_getmem_cnt: ptruint;
|
|
function MemCheck_freemem_cnt: ptruint;
|
|
function MemCheck_getmem_size: ptruint;
|
|
function MemCheck_freemem_size: ptruint;
|
|
function MemCheck_getmem8_size: ptruint;
|
|
function MemCheck_freemem8_size: ptruint;
|
|
{$ENDIF}
|
|
|
|
{$IFDEF MC_ImplementationStart}
|
|
// override RunError and Halt for better debugging
|
|
procedure RunError(RunErrorNumber: word); forward;
|
|
procedure Halt(ErrNum: byte); forward;
|
|
{$ENDIF MC_ImplementationStart}
|
|
|
|
{$IFDEF MC_ImplementationEnd}
|
|
// override RunError, so we can handle them according to the flags
|
|
procedure RunError(RunErrorNumber: word);
|
|
begin
|
|
if ExceptOnError then begin
|
|
// create an gdb catchable exception
|
|
if 0=(1 div ((ord(ExceptOnError) and 1) shr 1)) then ;
|
|
end;
|
|
if HaltOnError then System.Halt(1);
|
|
System.RunError(RunErrorNumber);
|
|
end;
|
|
|
|
// override RunError, so we can handle them according to the flags
|
|
procedure Halt(ErrNum: byte);
|
|
begin
|
|
if ExceptOnError then begin
|
|
// create an gdb catchable exception
|
|
if 0=(1 div ((ord(ExceptOnError) and 1) shr 1)) then ;
|
|
end;
|
|
System.Halt(1);
|
|
end;
|
|
|
|
// StartAddition for CodeTools
|
|
procedure CheckHeap;
|
|
var
|
|
p: pointer;
|
|
OldQuickTrace: boolean;
|
|
begin
|
|
writeln('>>> memcheck.pp - CheckHeap');
|
|
OldQuickTrace:=QuickTrace;
|
|
QuickTrace:=false;
|
|
GetMem(p,4);
|
|
FreeMem(p);
|
|
QuickTrace:=OldQuickTrace;
|
|
end;
|
|
|
|
procedure CheckHeap(const txt: ansistring);
|
|
var
|
|
p: pointer;
|
|
OldQuickTrace: boolean;
|
|
begin
|
|
writeln('>>> memcheck.pp - CheckHeap "',txt,'"');
|
|
OldQuickTrace:=QuickTrace;
|
|
QuickTrace:=false;
|
|
GetMem(p,4);
|
|
FreeMem(p);
|
|
QuickTrace:=OldQuickTrace;
|
|
end;
|
|
|
|
const
|
|
LastWrittenGetMemCnt: longint = 0;
|
|
HiddenGetMemCnt: longint = 0;
|
|
|
|
procedure CheckHeapWrtMemCnt(const txt: ansistring);
|
|
var
|
|
p: pointer;
|
|
StartGetMemCnt, CurGetMemCount, DiffGetMemCount: longint;
|
|
OldQuickTrace: boolean;
|
|
begin
|
|
StartGetMemCnt:=MemCheck_getmem_cnt;
|
|
CurGetMemCount:=StartGetMemCnt-HiddenGetMemCnt;
|
|
DiffGetMemCount:=CurGetMemCount-LastWrittenGetMemCnt;
|
|
LastWrittenGetMemCnt:=CurGetMemCount;
|
|
|
|
writeln('>>> memcheck.pp - CheckHeap2 "',txt,'" ',
|
|
CurGetMemCount,'(',StartGetMemCnt,') +',DiffGetMemCount);
|
|
OldQuickTrace:=QuickTrace;
|
|
QuickTrace:=false;
|
|
GetMem(p,4);
|
|
FreeMem(p);
|
|
QuickTrace:=OldQuickTrace;
|
|
|
|
// don't count mem counts of this proc
|
|
inc(HiddenGetMemCnt,MemCheck_getmem_cnt-StartGetMemCnt);
|
|
end;
|
|
|
|
procedure WriteGetMemCount(const txt: ansistring);
|
|
var
|
|
StartGetMemCnt, CurGetMemCount, DiffGetMemCount: longint;
|
|
begin
|
|
StartGetMemCnt:=MemCheck_getmem_cnt;
|
|
CurGetMemCount:=StartGetMemCnt-HiddenGetMemCnt;
|
|
DiffGetMemCount:=CurGetMemCount-LastWrittenGetMemCnt;
|
|
LastWrittenGetMemCnt:=CurGetMemCount;
|
|
|
|
writeln('>>> memcheck.pp - WriteGetMemCount "',txt,'" ',
|
|
CurGetMemCount,'(',StartGetMemCnt,') +',DiffGetMemCount);
|
|
|
|
// don't count mem counts of this proc
|
|
inc(HiddenGetMemCnt,MemCheck_getmem_cnt-StartGetMemCnt);
|
|
end;
|
|
|
|
function MemCheck_getmem_cnt: ptruint;
|
|
begin
|
|
MemCheck_getmem_cnt:=heap_info.getmem_cnt;
|
|
end;
|
|
|
|
function MemCheck_freemem_cnt: ptruint;
|
|
begin
|
|
MemCheck_freemem_cnt:=heap_info.freemem_cnt;
|
|
end;
|
|
|
|
function MemCheck_getmem_size: ptruint;
|
|
begin
|
|
MemCheck_getmem_size:=heap_info.getmem_size;
|
|
end;
|
|
|
|
function MemCheck_freemem_size: ptruint;
|
|
begin
|
|
MemCheck_freemem_size:=heap_info.freemem_size;
|
|
end;
|
|
|
|
function MemCheck_getmem8_size: ptruint;
|
|
begin
|
|
MemCheck_getmem8_size:=heap_info.getmem8_size;
|
|
end;
|
|
|
|
function MemCheck_freemem8_size: ptruint;
|
|
begin
|
|
MemCheck_freemem8_size:=heap_info.freemem8_size;
|
|
end;
|
|
// Addition for CodeTools
|
|
|
|
{$ENDIF MC_ImplementationEnd}
|