【问题标题】:Getting the size of the callstack获取调用堆栈的大小
【发布时间】:2011-11-21 08:24:52
【问题描述】:

有没有办法在 C++ 中获取调用堆栈的大小(以字节为单位)?
或者至少是它的底部地址(然后我可以从 ESP 寄存器中减去它?

【问题讨论】:

  • 只是好奇,你为什么需要知道它?
  • 在main的开头,可以在main()函数中设置一个全局指针变量指向一个局部变量的地址。然后,您可以从局部变量中减去该全局指针地址以估计堆栈使用情况。
  • 我过去做过测量我的最大堆栈使用量,看看我是否需要关闭更多对象,或者能够在其上放置更多对象。
  • @Mooing Duck:您假设堆栈帧在内存中是连续的。对此没有要求,一些系统实际上将堆栈帧放在堆中,以尝试防止恶意代码破坏堆栈。
  • 您是否在寻找 callStack 可以增长到的最大大小? msdn.microsoft.com/en-us/library/tdkhxaks(v=vs.80).aspx 显示可设置(在 Windows 上),默认为 1MB。

标签: c++ windows callstack


【解决方案1】:

【讨论】:

  • 我对查找调用堆栈中的帧数或遍历调用堆栈不感兴趣,但对它的大小(以字节为单位)感兴趣。
  • 查找堆栈帧的数量是唯一以有意义的方式测量堆栈大小的方法。
  • 通过遍历栈帧并将调用栈中每个帧指针之间的差异相加,可以得到栈的总大小。
【解决方案2】:

您可以尝试使用VirtualQuery 两次。

第一次可以使用栈上任意值的地址来获取提交栈空间的基地址和大小(以字节为单位)。

从基地址中减去大小并再次调用 VirtualQuery。这样您就可以获得为堆栈保留的空间。

将这两个大小相加得到总堆栈大小。

【讨论】:

  • 好的,这会给我当前堆栈大小吗?你是什​​么意思“基址”?为堆栈分配的最低地址?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2013-12-22
  • 2012-08-14
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多