【问题标题】:memory used by a program in bytes in c language under windowswindows下c语言程序使用的内存字节数
【发布时间】:2012-01-18 18:38:32
【问题描述】:

如何在 Windows 上进行系统或库调用以了解运行 C 程序的程序的内存使用情况?

【问题讨论】:

    标签: c memory memory-management windows-7


    【解决方案1】:

    很大程度上取决于您所说的该程序使用的内存是什么意思。举一个明显的例子,Windows DLL 映射到几乎所有程序的地址空间。您是否考虑程序使用的内存?如果您有两个(或更多)程序实例正在运行,它自己的可执行文件(和任何 DLL)通常也会映射到所有这些进程。同时,其中很大一部分可能只是地址空间——未使用的代码可能根本不会加载到物理内存中。

    综上所述,这是一个程序,它将遍历指定进程的内存块并转储有关它们的信息。根据进程使用的内存的含义,您可能(例如)正在寻找标记为 Private 的块。

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    unsigned long usage;
    
    void show_modules(HANDLE process) {
    
        unsigned char *p = NULL;
        MEMORY_BASIC_INFORMATION info;
    
        for ( p = NULL;
            VirtualQueryEx(process, p, &info, sizeof(info)) == sizeof(info);
            p += info.RegionSize ) 
        {
            printf("%#10.10x (%6uK)\t", info.BaseAddress, info.RegionSize/1024);
    
            switch (info.State) {
            case MEM_COMMIT:
                printf("Committed");
                break;
            case MEM_RESERVE:
                printf("Reserved");
                break;
            case MEM_FREE:
                printf("Free");
                break;
            }
            printf("\t");
            switch (info.Type) {
            case MEM_IMAGE:
                printf("Code Module");
                break;
            case MEM_MAPPED:
                printf("Mapped     ");
                break;
            case MEM_PRIVATE:
                printf("Private    ");
            }
            printf("\t");
    
            if ((info.State == MEM_COMMIT) && (info.Type == MEM_PRIVATE))
                usage +=info.RegionSize;
    
            int guard = 0, nocache = 0;
    
            if ( info.AllocationProtect & PAGE_NOCACHE)
                nocache = 1;
            if ( info.AllocationProtect & PAGE_GUARD )
                guard = 1;
    
            info.AllocationProtect &= ~(PAGE_GUARD | PAGE_NOCACHE);
    
            switch (info.AllocationProtect) {
            case PAGE_READONLY:
                printf("Read Only");
                break;
            case PAGE_READWRITE:
                printf("Read/Write");
                break;
            case PAGE_WRITECOPY:
                printf("Copy on Write");
                break;
            case PAGE_EXECUTE:
                printf("Execute only");
                break;
            case PAGE_EXECUTE_READ:
                printf("Execute/Read");
                break;
            case PAGE_EXECUTE_READWRITE:
                printf("Execute/Read/Write");
                break;
            case PAGE_EXECUTE_WRITECOPY:
                printf("COW Executable");
                break;
            }
    
            if (guard)
                printf("\tguard page");
            if (nocache)
                printf("\tnon-cachable");
            printf("\n");
        }
    }
    
    int main(int argc, char **argv) {
    
        int pid;
    
        if (argc != 2) {
            fprintf(stderr, "Usage: %s <process ID>", argv[0]);
            return 1;
        }
    
        sscanf(argv[1], "%i", &pid);
    
        HANDLE process = OpenProcess( 
            PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, 
            false,
            pid);
    
        show_modules(process);
        printf("Total memory used: %luKB\n", usage/1024);
        return 0;
    }        
    

    【讨论】:

      【解决方案2】:

      看看这个使用GetProcessMemoryInfo的例子:

      #include <windows.h>
      #include <stdio.h>
      #include <psapi.h>
      
      // To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS
      // and compile with -DPSAPI_VERSION=1
      
      void PrintMemoryInfo( DWORD processID )
      {
          HANDLE hProcess;
          PROCESS_MEMORY_COUNTERS pmc;
      
          // Print the process identifier.
      
          printf( "\nProcess ID: %u\n", processID );
      
          // Print information about the memory usage of the process.
      
          hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
                                          PROCESS_VM_READ,
                                          FALSE, processID );
          if (NULL == hProcess)
              return;
      
          if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
          {
              printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
              printf( "\tPeakWorkingSetSize: 0x%08X\n", 
                        pmc.PeakWorkingSetSize );
              printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
              printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n", 
                        pmc.QuotaPeakPagedPoolUsage );
              printf( "\tQuotaPagedPoolUsage: 0x%08X\n", 
                        pmc.QuotaPagedPoolUsage );
              printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n", 
                        pmc.QuotaPeakNonPagedPoolUsage );
              printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n", 
                        pmc.QuotaNonPagedPoolUsage );
              printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage ); 
              printf( "\tPeakPagefileUsage: 0x%08X\n", 
                        pmc.PeakPagefileUsage );
          }
      
          CloseHandle( hProcess );
      }
      
      int main( void )
      {
          // Get the list of process identifiers.
      
          DWORD aProcesses[1024], cbNeeded, cProcesses;
          unsigned int i;
      
          if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
          {
              return 1;
          }
      
          // Calculate how many process identifiers were returned.
      
          cProcesses = cbNeeded / sizeof(DWORD);
      
          // Print the memory usage for each process
      
          for ( i = 0; i < cProcesses; i++ )
          {
              PrintMemoryInfo( aProcesses[i] );
          }
      
          return 0;
      }
      

      http://msdn.microsoft.com/en-us/library/windows/desktop/ms682050(v=vs.85).aspx

      【讨论】:

      • 我认为这段代码是用于进程的代码,但我需要一个代码,通过它我可以用 c 语言打印我的程序使用的内存,就像我已经打印了程序用于执行的时间,所以我想要知道它使用的内存....
      • 是的,你将你的程序与这个分开运行,然后你运行这个程序并在列表中查找你的程序。
      • 但我需要嵌入的东西
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      相关资源
      最近更新 更多