【发布时间】:2010-04-29 23:46:49
【问题描述】:
如何查看我的 delphi 应用程序中当前使用了多少堆栈空间?我遇到了一个非常奇怪的错误,听起来像是堆栈问题。我想将它添加到我的应用程序的日志中,以了解正在使用/剩余的堆栈空间。使用调试器可能不是很好,因为该例程可以被多次调用。
谢谢!
【问题讨论】:
标签: delphi stack delphi-2009
如何查看我的 delphi 应用程序中当前使用了多少堆栈空间?我遇到了一个非常奇怪的错误,听起来像是堆栈问题。我想将它添加到我的应用程序的日志中,以了解正在使用/剩余的堆栈空间。使用调试器可能不是很好,因为该例程可以被多次调用。
谢谢!
【问题讨论】:
标签: delphi stack delphi-2009
这应该会为您提供当前的堆栈使用情况:
function CurrentStackUsage: DWord;
asm
mov eax, fs:[4]
sub eax, esp
end;
我不记得有一种简单的方法可以在运行时获取最大堆栈大小,但是您的链接器选项中有默认值。
【讨论】:
来自 SysInternals 的VMmap 可以为您提供应用程序使用的每种内存类型的图形视图,包括堆栈。它不会像 Per Larsen 的回答中的函数那样为您提供确切的用法,但可以帮助您可视化应用程序不同阶段的内存使用情况。
【讨论】:
{$IFDEF MSWINDOWS}
function currentStackUsage: NativeUInt;
//NB: Win32 uses FS, Win64 uses GS as base for Thread Information Block.
asm
{$IFDEF WIN32}
mov eax, fs:[4] // TIB: base of the stack
sub eax, esp // compute difference in EAX (=Result)
{$ENDIF}
{$IFDEF WIN64}
mov rax, gs:[8] // TIB: base of the stack
sub rax, rsp // compute difference in RAX (=Result)
{$ENDIF}
{$ENDIF}
end;
【讨论】: