为什么Windbg看不到在delphi中创建的内存泄漏?

时间:2016-11-25 14:48:07

标签: delphi debugging windbg

正如主题所说,为什么windbg看不到在delphi中分配的任何内存?例如!heap -s什么都没有,而有意为了测试目的而故意创建10MB内存泄漏。

delphi如何在不从堆中获取内存的情况下分配内存?

1 个答案:

答案 0 :(得分:8)

!heap适用于通过调用HeapAllocHeapReAlloc等分配的内存.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堆分配。