[英]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.