модуль MemoryManager;
интерфейс
PROcedure SnapCurrMemStatToFile (имя файла: строка);
выполнение
использует
Windows, SysUtils, ТипИнфо;
константа
MaxCount = Высокий (Слово);
вар
OldMemMgr: TMemoryManager;
ObjList: массив [0..MaxCount] указателя;
FreeInList: целое число = 0;
GetMemCount: целое число = 0;
FreeMemCount: целое число = 0;
ReallocMemCount: целое число = 0;
процедура AddToList(P: Указатель);
начинать
если FreeInList > High(ObjList), то
начинать
MessageBox(0, '内存管理监视器指针列表溢出,请增大列表项数!', '内存管理监视器', mb_ok);
Выход;
конец;
ObjList[FreeInList] := P;
Inc(FreeInList);
конец;
процедура RemoveFromList(P: Указатель);
вар
Я: целое число;
начинать
для I := 0 в FreeInList - 1 сделать
если ObjList[I] = P, то
начинать
Декабрь (FreeInList);
Move(ObjList[I + 1], ObjList[I], (FreeInList - I) * SizeOf(Pointer));
Выход;
конец;
конец;
процедура SnapCurrMemStatToFile (имя файла: строка);
константа
ПОЛЯ_ШИРИНА = 20;
вар
Выходной файл: Текстовый файл;
Я, CurrFree, BlockSize: Integer;
Статус кучи: THeapStatus;
Элемент: ТОбъект;
птд: ПТипДанные;
ppi: PPropInfo;
Вывод процедуры (Текст: строка; Значение: целое число);
начинать
Writeln(OutFile, Text: FIELD_WIDTH, Value div 1024, ' КБ(', Value, ' Байт)');
конец;
начинать
AssignFile(OutFile, имя файла);
пытаться
если FileExists(имя файла), то
начинать
Добавить(OutFile);
Writeln(OutFile);
конец
еще
Переписать (OutFile);
CurrFree := FreeInList;
HeapStatus := GetHeapStatus; { 局部堆状态 }
с HeapStatus сделать
начинать
Writeln(OutFile, '===== ', ExtractFileName(ParamStr(0)), ',', DateTimeToStr(Now), ' =====');
Writeln(OutFile);
Output('Выходной сигнал:', TotalAddrSpace);
Output('未提交部分: ', TotalUncommitted);
Output('已提交部分: ', TotalCommitted);
Output('空闲部分: ', TotalFree);
Output('已分配部分:', TotalAllocated);
Output('Оборудование для быстрого запуска: ', FreeSmall);
Output('Оборудование для быстрого запуска: ', FreeBig);
Output('其它未用内存块: ', Не используется);
Output('内存管理器消耗 : ', Overhead);
Writeln(OutFile, '地址空间载入: ': FIELD_WIDTH, TotalAllocated div (TotalAddrSpace div 100), '%');
конец;
Writeln(OutFile);
Writeln(OutFile, Format('当前出现 %d 处内存漏洞 :', [GetMemCount - FreeMemCount]));
для I := 0 до CurrFree - 1 сделать
начинать
Write(OutFile, I: 4, ') ', IntToHex(Cardinal(ObjList[I]), 16), ' - ');
BlockSize := PDWORD(DWORD(ObjList[I]) - 4)^;
Write(OutFile, BlockSize: 4, '($' + IntToHex(BlockSize, 4) + ')字节', ' - ');
пытаться
Элемент: = TObject(ObjList[I]);
if PTypeInfo(Item.ClassInfo).Kind <> tkClass then {метод получения информации о типе}
write(OutFile, '不是对象')
еще
начинать
ptd := GetTypeData(PTypeInfo(Item.ClassInfo));
ppi := GetPropInfo(PTypeInfo(Item.ClassInfo), 'Name'); { 如果是TComponent }
если ppi <> ноль, то
начинать
write(OutFile, GetStrProp(Item, ppi));
запись(OutFile, ': ');
конец
еще
write(OutFile, '(未命名): ');
Write(OutFile, Item.ClassName, ' (', ptd.ClassType.InstanceSize,
' 字节) - In ', ptd.UnitName, '.pas');
конец
кроме
в исключении сделать
write(OutFile, '不是对象');
конец;
writeln(OutFile);
конец;
окончательно
ЗакрытьФайл(OutFile);
конец;
конец;
функция NewGetMem (Размер: целое число): указатель;
начинать
Inc(GetMemCount);
Результат: = OldMemMgr.GetMem(Size);
ДобавитьСписок(Результат);
конец;
функция NewFreeMem(P: Pointer): Integer;
начинать
Inc(FreeMemCount);
Результат: = OldMemMgr.FreeMem(P);
УдалитьИзСписка(P);
конец;
функция NewReallocMem(P: Указатель; Размер: Целое число): Указатель;
начинать
Inc(ReallocMemCount);
Результат: = OldMemMgr.ReallocMem(P, Size);
УдалитьИзСписка(P);
ДобавитьСписок(Результат);
конец;
константа
NewMemMgr: TMemoryManager = (
GetMem: НьюГетМем;
ФриМем: НьюФриМем;
ReallocMem: НьюРеаллокМем);
инициализация
GetMemoryManager(OldMemMgr);
SetMemoryManager(NewMemMgr);
завершение
SetMemoryManager(OldMemMgr);
если (GetMemCount - FreeMemCount) <> 0, то
SnapCurrMemStatToFile(ExtractFileDir(ParamStr(0)) + '/Memory.Log');
конец.