如何在VisualStudio中测量C程序的函数堆栈大小?

如何在VisualStudio中测量C程序的函数堆栈大小?,c,visual-studio,optimization,memory,profiling,C,Visual Studio,Optimization,Memory,Profiling,我有一个非常大的C项目,目前存在于VisualStudio解决方案中。我正在使用Visual Studio 2015。项目的每个组件都包含在其自己的VisualStudio项目中。每个组件都有一个“init”和一个在while循环中调用的“run”函数。我有一个特别的组件,我想测量它的“run”函数的堆栈大小。理想情况下,我会将一个特定参数更改为run函数,并查看它如何进一步影响内存(因此运行多个评测)。对于GCC,我发现您可以使用fstack用法,这几乎完全符合我的要求:程序中每个函数的内存消

我有一个非常大的C项目,目前存在于VisualStudio解决方案中。我正在使用Visual Studio 2015。项目的每个组件都包含在其自己的VisualStudio项目中。每个组件都有一个“init”和一个在while循环中调用的“run”函数。我有一个特别的组件,我想测量它的“run”函数的堆栈大小。理想情况下,我会将一个特定参数更改为run函数,并查看它如何进一步影响内存(因此运行多个评测)。对于GCC,我发现您可以使用fstack用法,这几乎完全符合我的要求:程序中每个函数的内存消耗(即堆栈大小)。然而,我在网上找到的大多数解决方案只适用于Linux系统。我还强烈希望不要将我的VS解决方案迁移到其他平台

然而,在VS中,我还没有找到工具、API或任何类似的东西。VS Performance Profiler有点像我希望的那样,但它没有提供每个函数的内存,只是提供整个过程的内存,这对于分析基于组件的项目来说并不理想。Visual Studio中是否有工具或方法可以测量所有可能函数的函数堆栈大小?我不介意写我自己的工具,但我更喜欢相对简单的东西

我应该在这里声明,我不需要整个进程的内存,或者调用堆栈的大小。也就是说,它应该打印出如下内容:

Function Name | Stack Size
--------------|------------
a_Run         | 10.5 KB
b_Run         |  5.7 KB

谢谢

一种非常复杂的方法是在调用
run
函数之前检测调用堆栈的开始,并将水印放置在从开始的固定范围内。然后,当
run
完成时,再次遍历带水印的内存范围,并检测水印仍然存在的位置与被run函数的实际堆栈使用情况替换的位置

要检测堆栈的开始,可以执行以下操作:

// before calling run
#define MAX_CALL_STACK 1024
volatile int start; // declare just before calling run
// fill from &start to something with a known pattern.
// the trick is to ensure no other stack allocation is performed here
register int i;
register int &add = &start;
for (i = 0 i<MAX_CALL_STACK ;i++)
{
  *add = 0xdeadbeef; a++;
}    
run(); // this will replace deadbeaf values up to a given address
printf ("run call stack start address:0x%p",(void*)&start);
//调用run之前
#定义最大调用堆栈1024
volatile int start;//在调用run之前声明
//用已知的模式填充从&开始到某物。
//诀窍是确保此处不执行其他堆栈分配
寄存器int i;
寄存器int&add=&start;
对于(i=0)i