如何从C ++程序内部测量内存使用情况?

问题描述 投票:31回答:4

对于c ++程序,有可能一次跟踪该程序正在使用多少内存吗?

例如,带有原型的函数:

int getEstimatedTotalMemoryUsage();

我想如果不可能的话,那么就必须退出程序,进行系统调用并从那里检查结果。如果是这样,有哪些工具可用于此类目的?假设有这种可能,那就是。

编辑:我正在使用linux,任何工具都可以为您做到这一点?

c++ memory-management
4个回答
34
投票

是-使用POSIX getrusage。从getrusage

简介

Linux man page

说明

对于

#include <sys/time.h> #include <sys/resource.h> int getrusage(int who, struct rusage *usage); getrusage()who[RUSAGE_SELF返回当前资源使用情况。前者请求当前进程使用的资源,后者请求已终止并等待其子进程的孩子使用的资源。

RUSAGE_CHILDREN

2
投票

我今天想要这个,我自己,所以在这里分享测试结果。我相信在任何unix框上,调用getmem()都会执行OP所要求的操作。用非常通用的C语言编写,它将在C或C ++中运行。

struct rusage {
    struct timeval ru_utime; /* user time used */
    struct timeval ru_stime; /* system time used */
    long   ru_maxrss;        /* maximum resident set size */
    long   ru_ixrss;         /* integral shared memory size */
    long   ru_idrss;         /* integral unshared data size */
    long   ru_isrss;         /* integral unshared stack size */
    long   ru_minflt;        /* page reclaims */
    long   ru_majflt;        /* page faults */
    long   ru_nswap;         /* swaps */
    long   ru_inblock;       /* block input operations */
    long   ru_oublock;       /* block output operations */
    long   ru_msgsnd;        /* messages sent */
    long   ru_msgrcv;        /* messages received */
    long   ru_nsignals;      /* signals received */
    long   ru_nvcsw;         /* voluntary context switches */
    long   ru_nivcsw;        /* involuntary context switches */
};

从技术上讲,我认为printf(...)行应为fprintf(stderr,...),但是出于某些特定于环境的日志记录原因,我倾向于将stderr重定向,这就是我编译和测试代码的方式,因此我要逐字复制以避免损坏。


1
投票

获取您的PID:// Calling function must free the returned result. char* exec(const char* command) { FILE* fp; char* line = NULL; // Following initialization is equivalent to char* result = ""; and just // initializes result to an empty string, only it works with // -Werror=write-strings and is so much less clear. char* result = (char*) calloc(1, 1); size_t len = 0; fflush(NULL); fp = popen(command, "r"); if (fp == NULL) { printf("Cannot execute command:\n%s\n", command); return NULL; } while(getline(&line, &len, fp) != -1) { // +1 below to allow room for null terminator. result = (char*) realloc(result, strlen(result) + strlen(line) + 1); // +1 below so we copy the final null terminator. strncpy(result + strlen(result), line, strlen(line) + 1); free(line); line = NULL; } fflush(fp); if (pclose(fp) != 0) { perror("Cannot close stream.\n"); } return result; } int getmem() { pid_t pid = getpid(); char cmd[64]; snprintf(cmd, 64, "/bin/ps -p %d -o size", pid); char* result = exec(cmd); if (!result) { return 0; } // Find first newline. int pos = 0; while (result[pos] != '\n') { pos++; } // Remove the final newline. result[strlen(result) - 1] = '\0'; // Convert to integer. int size = atoi(result + pos + 1); free(result); return size; }

解析pid_t getpid(void); // unistd.h

如果您不关心mem total中的共享库,可能会更简单

/proc/<id>/smaps进行系统调用


0
投票

这里是测量Windows上进程使用的内存的示例。

ps -p <id>  -o %mem

以及返回值的说明#include <windows.h> #include <Psapi.h> // [...] PROCESS_MEMORY_COUNTERS memCounter; BOOL result = K32GetProcessMemoryInfo(GetCurrentProcess(), &memCounter, sizeof(memCounter)); std::cout << "WorkingSetSize " << memCounter.WorkingSetSize << std::endl;

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