gpt4 book ai didi

c - windows下c语言一个程序使用的内存,以字节为单位

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:17 33 4
gpt4 key购买 nike

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

最佳答案

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

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

#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;
}

关于c - windows下c语言一个程序使用的内存,以字节为单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8915480/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com