如何测量Visual Studio中C程序的函数栈大小?

问题描述 投票:2回答:1

我有一个非常大的C项目,目前存在于Visual Studio解决方案中。我使用的是Visual Studio 2015。该项目中的每个组件都包含在自己的Visual Studio项目中。每个组件都有一个 "init "和一个在while循环中调用的 "run "函数。我有一个组件特别想测量其 "运行 "函数的堆栈大小。理想的情况是,我改变了那个运行函数的一个特定参数,然后看看它对内存的影响(所以要运行多个分析)。对于GCC,我发现你可以使用fstack-usage,这几乎就是我想要的:程序中每个函数的内存消耗(即堆栈大小)。然而我在网上找到的大多数解决方案只适用于Linux系统。我也非常喜欢 不迁徙 我的VS解决方案到不同的平台。

然而,在VS中,我还没有找到一个工具、API或类似的东西。VS性能分析器 一种 做了我想做的事情,但它没有给出每个函数的内存,只是给出了整个进程的内存,这对于分析一个基于组件的项目来说并不理想。在Visual Studio中有没有一种工具或方法可以让我测量所有可能的函数的函数栈大小?我不介意自己写一个工具,但我更喜欢相对简单的工具。

在这里我也要声明,我不想要整个进程的内存,或者调用堆栈大小。也就是说,它应该打印出这样的东西。

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

谢谢!

c visual-studio optimization memory profiling
1个回答
0
投票

一个相当huglyhacky的方法可以是在调用调用栈之前检测调用栈的开始。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);

编译后的水印代码应被检查,以确保它确实使用了寄存器,并且在调用运行前没有声明任何其他本地变量。

我没有展示如何检测expanse of the 0xdeadbeef 但这不应是那么复杂。

© www.soinside.com 2019 - 2024. All rights reserved.