正如主题所说,为什么windbg看不到在delphi中分配的任何内存?例如!heap -s什么都没有,而有意为了测试目的而故意创建10MB内存泄漏。
delphi如何在不从堆中获取内存的情况下分配内存?
答案 0 :(得分:8)
!heap
适用于通过调用HeapAlloc
,HeapReAlloc
等分配的内存.Delphi的默认内存管理器使用VirtualAlloc
然后实现自己的子分配器。因此,Delphi的内存管理器正在向HeapAlloc
执行类似的任务。但是这意味着由!heap
看不到Delphi默认内存管理器分配的内存。
如果你真的想使用WinDbg和!heap
那么你可以用一个内置HeapAlloc
的内存管理器替换它。也许这符合您的调试要求。我不太清楚是什么驱使你去WinDbg和!heap
。
或者,如果您想要使用本机Delphi方法来查找泄漏,您可以使用FastMM4(完整版本而不是Delphi内置版本)或madExcept 4等工具。
作为基于HeapAlloc
构建的简单内存管理器替换的演示,我提供了这个单元:
unit HeapAllocMM;
interface
implementation
uses
Windows;
function GetMem(Size: NativeInt): Pointer;
begin
Result := HeapAlloc(0, 0, size);
end;
function FreeMem(P: Pointer): Integer;
begin
HeapFree(0, 0, P);
Result := 0;
end;
function ReallocMem(P: Pointer; Size: NativeInt): Pointer;
begin
Result := HeapReAlloc(0, 0, P, Size);
end;
function AllocMem(Size: NativeInt): Pointer;
begin
Result := GetMem(Size);
if Assigned(Result) then begin
FillChar(Result^, Size, 0);
end;
end;
function RegisterUnregisterExpectedMemoryLeak(P: Pointer): Boolean;
begin
Result := False;
end;
const
MemoryManager: TMemoryManagerEx = (
GetMem: GetMem;
FreeMem: FreeMem;
ReallocMem: ReallocMem;
AllocMem: AllocMem;
RegisterExpectedMemoryLeak: RegisterUnregisterExpectedMemoryLeak;
UnregisterExpectedMemoryLeak: RegisterUnregisterExpectedMemoryLeak
);
initialization
SetMemoryManager(MemoryManager);
end.
将其列为.dpr文件的uses子句中的第一个单元。完成此操作后,WinDbg !heap
应该开始看到您的Delphi堆分配。