【问题标题】:how can i see how much of the stack space is currently used in my delphi app?如何查看我的 delphi 应用程序中当前使用了多少堆栈空间?
【发布时间】:2010-04-29 23:46:49
【问题描述】:

如何查看我的 delphi 应用程序中当前使用了多少堆栈空间?我遇到了一个非常奇怪的错误,听起来像是堆栈问题。我想将它添加到我的应用程序的日志中,以了解正在使用/剩余的堆栈空间。使用调试器可能不是很好,因为该例程可以被多次调用。

谢谢!

【问题讨论】:

    标签: delphi stack delphi-2009


    【解决方案1】:

    这应该会为您提供当前的堆栈使用情况:

    function CurrentStackUsage: DWord;
    asm
      mov eax, fs:[4]
      sub eax, esp
    end;
    

    我不记得有一种简单的方法可以在运行时获取最大堆栈大小,但是您的链接器选项中有默认值。

    【讨论】:

    • 感谢您的回复!我很惊讶这个返回的值有多小。这将表明堆栈最多使用了大约 1%。这个数字是字节吗?
    • 谢谢,为什么没有改变?我的应用返回的 3500 是什么意思?!
    【解决方案2】:

    来自 SysInternals 的VMmap 可以为您提供应用程序使用的每种内存类型的图形视图,包括堆栈。它不会像 Per Larsen 的回答中的函数那样为您提供确切的用法,但可以帮助您可视化应用程序不同阶段的内存使用情况。

    【讨论】:

    • 有趣的应用程序;我可以从中学到新的东西。谢谢!
    【解决方案3】:
    {$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;
    

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 2012-10-05
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 2011-04-24
      • 2018-05-02
      相关资源
      最近更新 更多