簡體   English   中英

如何使用進程的 memory 用法檢查 memory 泄漏?

[英]How to check memory leaks using memory usages of a process?

int ParseLine(char* line){
   int i = strlen(line);
   const char* p = line;
   while(*p < '0' || *p > '9') p++;    // Search until a number is found.
   line[i - 3] = '\0'; // Remove " kB"
   i = atoi(p);
   return i;
}

int GetCurrentVirtualMem(){
   std::string cur_proc;
   cur_proc = "/proc/" + std::to_string((int)getpid()) + "/status";

   FILE* fs = fopen(cur_proc.c_str(), "r");
   int result = -1;
   char line[128];

   while(fgets(line, 128, fs) != NULL){
       if(strncmp(line, "VmSize:", 7) == 0){
           result = ParseLine(line);
           break;
       }
   }
   fclose(fs);
   fs = NULL;  //garly modify, for test memory problem

   return result;
}

int GetCurrentMem(){
   std::string cur_proc;
   cur_proc = "/proc/" + std::to_string((int)getpid()) + "/status";

   FILE* fs = fopen(cur_proc.c_str(), "r");
   int result = -1;
   char line[128];

   while(fgets(line, 128, fs) != NULL){
       if(strncmp(line, "VmRSS:", 6) == 0){
           result = ParseLine(line);
           break;
       }
   }
   fclose(fs);
   fs = NULL;  //garly modify, for test memory problem
   return result;
}

我正在嘗試檢查 memory 泄漏,但我不清楚物理 memory 和虛擬 memory。 所以我只是使用上面的功能打印了兩個。

float curr_mem = (float)GetCurrentMem() / 1000;
float curr_vir_mem = (float)GetCurrentVirtualMem() / 1000;
std::cout << "Using memory(" << std::to_string((int)getpid()) << "): " << curr_mem << ", " << curr_vir_mem << std::endl;

如果我查看物理memory或虛擬memory的變化,我應該看哪一個? 兩個都? 還是其中之一?

而且我發現即使沒有 memory 泄漏,memory 值也會發生變化。

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);

   float prev_mem = 0;
   float prev_vir_mem = 0;
   while(true){

       int* mem_leak = new int[100];


       float curr_mem = (float)GetCurrentMem() / 1000;
       float curr_vir_mem = (float)GetCurrentVirtualMem() / 1000;

       if(prev_mem != curr_mem || prev_vir_mem != curr_vir_mem){
           prev_mem = curr_mem ;
           prev_vir_mem = curr_vir_mem;

           std::cout << "Using memory(" << std::to_string((int)getpid()) << "): " << curr_mem << ", " << curr_vir_mem << std::endl;
       }

       delete[] mem_leak;
   }
   return 0;
}

運行上面的代碼一個小時后,它顯示了 memory 中的變化

Using memory(3303): 28.296, 250.788 
Using memory(3303): 28.652, 250.788 
Using memory(3303): 28.916, 250.788

那么這種方法是否可以檢查 memory 是否泄漏? 我使用了“Valgrind”,但它沒有顯示我的代碼中的任何 memory 泄漏消息(不是上面的代碼。它太大了,無法在此處上傳。超過 30000 行。)。 但它在長期運行測試(約1周)中顯示memory變化。

請告訴我如何在不使用其他軟件(如 Valgrind)的情況下正確檢查 memory 泄漏。

如果我對你的理解正確,你想使用來自未以任何方式檢測的進程的進程映像來檢查 Linux 上的 memory 泄漏。

https://github.com/vmware/chap (免費開源)就是這樣做的。

首先你收集一個核心:

echo 0x37 > /proc/<pid-of-your-process>/coredump_filter
gcore <pid-of-your-process>

然后你在章節中打開核心:

chap <core-just-created-by-gcore>

要檢查經典類型的泄漏(無法再到達的對象),您可以在 chap 提示符下使用以下命令:

count leaked

這告訴你有多少對象被泄露了。

describe leaked /showUpTo 100

這描述了每個泄漏的 object,給出了每個 object 的最多 0x100 字節的十六進制轉儲,並在最后給出了計數。

還有各種其他命令可用,但我不想重復用戶手冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM