unité MemoryManager ;
interface
PROcédure SnapCurrMemStatToFile (Nom de fichier : chaîne );
mise en œuvre
utilise
Windows, SysUtils, TypInfo ;
const
MaxCount = Élevé (Mot);
var
OldMemMgr : TMemoryManager ;
ObjList : tableau[0..MaxCount] de pointeur ;
FreeInList : Entier = 0 ;
GetMemCount : entier = 0 ;
FreeMemCount : Entier = 0 ;
ReallocMemCount : entier = 0 ;
procédure AddToList(P: Pointeur);
commencer
si FreeInList > High(ObjList) alors
commencer
MessageBox(0, '内存管理监视器指针列表溢出,请增大列表项数!', '内存管理监视器', mb_ok);
Sortie;
fin;
ObjList[FreeInList] := P;
Inc(FreeInList);
fin;
procédure RemoveFromList(P: Pointeur);
var
I : Entier ;
commencer
pour I := 0 à FreeInList - 1 faire
si ObjList[I] = P alors
commencer
Déc(FreeInList);
Move(ObjList[I + 1], ObjList[I], (FreeInList - I) * SizeOf(Pointer));
Sortie;
fin;
fin;
procédure SnapCurrMemStatToFile (Nom de fichier : chaîne );
const
FIELD_WIDTH = 20 ;
var
Fichier sortant : fichier texte ;
I, CurrFree, BlockSize : entier ;
État du tas : THeapStatus ;
Élément : TObject ;
ptd : PTypeData ;
ppp : PPropInfo ;
procédure Sortie (Texte : chaîne ; Valeur : entier) ;
commencer
Writeln(OutFile, Texte : FIELD_WIDTH, Valeur div 1024, ' KB(', Valeur, ' Octet)');
fin;
commencer
AssignFile(OutFile, Nom de fichier);
essayer
si FileExists (Filename) alors
commencer
Ajouter(OutFile);
Writeln(OutFile);
fin
autre
Réécrire (OutFile);
CurrFree := FreeInList;
HeapStatus := GetHeapStatus ; { 局部堆状态 }
avec HeapStatus faire
commencer
Writeln(OutFile, '===== ', ExtractFileName(ParamStr(0)), ',', DateTimeToStr(Now), ' =====');
Writeln(OutFile);
Output('可用地址空间 : ', TotalAddrSpace);
Output('未提交部分 : ', TotalUncommit);
Output('已提交部分 : ', TotalCommit);
Output('空闲部分 : ', TotalFree);
Output('已分配部分 : ', TotalAllocated);
Output('全部小空闲内存块 : ', FreeSmall);
Output('全部大空闲内存块 : ', FreeBig);
Output('其它未用内存块 : ', Inutilisé);
Output('内存管理器消耗 : ', Overhead);
Writeln(OutFile, '地址空间载入 : ': FIELD_WIDTH, TotalAllocated div (TotalAddrSpace div 100), '%');
fin;
Writeln(OutFile);
Writeln(OutFile, Format('当前出现 %d 处内存漏洞 :', [GetMemCount - FreeMemCount]));
pour I := 0 à CurrFree - 1 faire
commencer
Write(OutFile, I : 4, ') ', IntToHex(Cardinal(ObjList[I]), 16), ' - ');
BlockSize := PDWORD(DWORD(ObjList[I]) - 4)^;
Write(OutFile, BlockSize: 4, '($' + IntToHex(BlockSize, 4) + ')字节', ' - ');
essayer
Article := TObject(ObjList[I]);
if PTypeInfo(Item.ClassInfo).Kind <> tkClass then { type info technique }
write(OutFile, '不是对象')
autre
commencer
ptd := GetTypeData(PTypeInfo(Item.ClassInfo));
ppi := GetPropInfo(PTypeInfo(Item.ClassInfo), 'Name'); { par TComponent }
si ppi <> nul alors
commencer
write(OutFile, GetStrProp(Item, ppi));
écrire(OutFile, ' : ');
fin
autre
write(OutFile, '(未命名): ');
Écrire (OutFile, Item.ClassName, ' (', ptd.ClassType.InstanceSize,
' 字节) - Dans ', ptd.UnitName, '.pas');
fin
sauf
à l'exception, faites
write(OutFile, '不是对象');
fin;
writeln(OutFile);
fin;
enfin
FermerFichier(OutFile);
fin;
fin;
function NewGetMem(Size : Integer) : Pointeur ;
commencer
Inc(ObtenirMemCount);
Résultat := OldMemMgr.GetMem(Taille);
AddToList (Résultat);
fin;
fonction NewFreeMem(P : Pointeur) : Entier ;
commencer
Inc(FreeMemCount);
Résultat := OldMemMgr.FreeMem(P);
RemoveFromList(P);
fin;
function NewReallocMem(P : Pointeur ; Taille : Integer) : Pointeur ;
commencer
Inc(ReallocMemCount);
Résultat := OldMemMgr.ReallocMem(P, Taille);
RemoveFromList(P);
AddToList (Résultat);
fin;
const
NewMemMgr : TMemoryManager = (
GetMem : NewGetMem ;
FreeMem : NewFreeMem ;
ReallocMem : NewReallocMem );
initialisation
GetMemoryManager(OldMemMgr);
SetMemoryManager(NewMemMgr);
finalisation
SetMemoryManager(OldMemMgr);
si (GetMemCount - FreeMemCount) <> 0 alors
SnapCurrMemStatToFile(ExtractFileDir(ParamStr(0)) + '/Memory.Log');
fin.