【问题标题】:find total memory used by program in c under windows在windows下查找c中程序使用的总内存
【发布时间】:2012-01-20 00:31:34
【问题描述】:

我有一个c中的小程序

#include <stdio.h>
#include <string.h>
#define SIZE 30

int main()
{
  char name[ SIZE ]; 
  FILE *fpPtr; 

  if ( ( fpPtr = fopen( "sorted_file.txt", "r" ) ) == NULL ) {
    printf( "File could not be opened\n" );
  } 
  else {
    printf( "%s\n", "Name" );
    fscanf( fpPtr, "%s", name );

    while( !feof( fpPtr ) ) {
       printf( "%s\n", name );
       fscanf( fpPtr, "%s", name );
    } 

    fclose( fpPtr ); 
  } 

 return 0; 
};

我想知道这个程序使用了多少内存。我应该添加任何代码或函数来查找该程序使用的总内存。我不想为此检查任务管理器。我需要打印内存使用情况。

【问题讨论】:

  • 你想知道这样一个程序的增量使用吗?或者您想知道程序的全部内存成本,包括库、打开文件的 o/s 开销等?
  • 这个问题明显比你之前的问题好,那里做得很好,但是当你没有得到答案时,请不要打开新问题。将原始问题改进到可以得到答案的程度,或者post a bounty 以引起对您的问题的更多关注。谢谢!

标签: c memory


【解决方案1】:

听起来你在关注GetProcessMemoryInfo()

您需要 Windows SDK 或来自 mingw32 的相应 Windows 头文件才能编译它(也可以在 Visual Studio 以及带有相应库的 cygwin 等中工作):

#include <windows.h> // these header gives you access to the Windows API -
#include <psapi.h> // include at the top of your code

// do this where you need to get that information - perhaps create a function
// for it.

HINSTANCE hProcHandle = GetModuleHandle(NULL);  // get the current process handle
PROCESS_MEMORY_COUNTERS_EX memory; // output will go here.

/* call function */
GetProcessMemoryInfo(hProcHandle, &memory, sizeof(memory));

您现在应该可以访问memory.WorkingSetSizememory.PrivateUsage,无论哪种方式对您来说都很重要。这些是size_t 类型,它们是大小取决于您的系统的无符号整数。

【讨论】:

    【解决方案2】:

    你前几天在 here 上问过这个问题,我给了你这个答案:

    虽然它不再被积极开发,但对于 C 和 ObjC 代码 (我都用过),我没有找到比MSS: Memory Supervision System更好的东西。

    设置非常简单;一直很 以我的经验准确,我已经用它来清除 我的应用程序中的任何内存泄漏。

    为了让您了解它的易用性:我将它编译成一个 静态库,将其链接到我的程序的调试目标并放置 include (import for ObjC) 将单个标头包含到公共共享中 我的程序的所有其余部分都使用的标头,因此它跟踪内存 整个程序都不需要考虑。

    MSS 将完全满足您的要求;它还会为您提供大量额外(非常有用)的信息,但报告的顶部包括以下几行:

    MSG: Listing info about allocated blocks at end of program:
    INFO: 107 blocks currently allocated
    INFO: 11720 bytes of memory currently used.
    INFO: 2384479 bytes maximum memory used.
    

    仅在这些行中,它会告诉您泄漏了多少内存块、确切地泄漏了多少内存以及您的程序使用的最大内存占用。

    如何使用 MSS:

    首先使用makefile构建库;只需使用make lib,因为我们不需要测试程序。如果您不使用 gcc,则需要更改 makefile 中的默认编译器。如果您使用 gcc 并且需要 64 位和 32 位版本,请将 -m64-m32 添加到第 53 行 CFLAGS=...,然后在文件上运行 make

    您现在应该有一个可以链接到您的程序的静态 MSS 库。您需要与库一起包含在程序中的唯一标头是mss.h。要实际使用 MSS,您需要将 #define MSS#include &lt;mss.h&gt; 放入您希望跟踪的每个文件中。如果您希望跟踪整个程序,请在编译器的参数中定义 MSS,并将其包含到每个源文件都包含的通用头文件中。

    字面意思就是这样;如果您希望更改其日志和其他功能的详细程度,可以将配置文件添加到程序目录中,但要使其正常工作,这就是您需要做的一切。顺便说一句,MSS 在其 doc 文件夹中包含完整的自述文件,其中更详细地描述了所有这些内容。

    【讨论】:

    • 但我不明白如何使用这个
    • 这个答案比你的另一个更好,所以工作得很好,但一般来说,当你找到它们时,请标记复制帖子以引起版主的注意。如果早期发现骗子,它可以帮助我们修剪网站。 :) 谢谢!
    • 我已经详细介绍了如何实际使用 MSS;如果您仍然不明白,我强烈建议您下载并阅读其中包含的说明。它提供了非常详细的说明,说明如何首先使其工作,然后是如何配置和充分使用它。 MSS 确实是您可以使用的最简单的此类库之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2020-05-12
    • 2011-07-16
    相关资源
    最近更新 更多