[英]Mmap and valgrind, mmap doesnt increase heap size
我正在參加我大學的操作系統課程,我們給出的任務之一是使用mmap實現簡單的malloc。 現在,我得到它的工作,我試圖使用valgrind來檢測任何錯誤。 無論是否釋放內存,valgrind都沒有看到任何內存泄漏。 作為示例,請考慮以下C代碼:
int main()
{
int psize = getpagesize(),i;
int *ptr = mmap(NULL, psize, PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
for(i = 0; i < psize/4; i++) ptr[i] = i;
for(i = 0; i < psize/4; i++) printf("%d\n", ptr[i]);
return 0;
}
讓我們用gcc編譯它,並使用valgrind。 這是valgrind返回的內容:
==17841== Memcheck, a memory error detector
==17841== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==17841== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==17841== Command: ./test
==17841==
------------ printing numbers from 0 to 1023
==17841==
==17841== HEAP SUMMARY:
==17841== in use at exit: 0 bytes in 0 blocks
==17841== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==17841==
==17841== All heap blocks were freed -- no leaks are possible
==17841==
==17841== For counts of detected and suppressed errors, rerun with: -v
==17841== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
這是意料之外的事情,我們通常希望在退出程序之前取消映射頁面以查看此類消息。
起初我認為頁面可能會被懶惰地映射,這就是為什么我強迫在頁面上執行某些操作,例如更改值和打印它們,但我們可以看到這不是問題。
這可能與valgrind或我對mmap和valgrind如何工作的理解有關。
mmap不會增加堆大小
堆與從mmap
獲得的內存分開。 Unix進程獲取內存有兩種基本方法:
brk(2)
/ sbrk(2)
增加“break” - 這就是堆 mmap
在內存中映射 - 這些獨立於堆 這可能與valgrind或我對mmap和valgrind如何工作的理解有關。
閱讀memcheck手冊可能會有所幫助,尤其是關於自定義分配器的部分。 它的要點是,為了泄漏檢查的目的, mmap
-allocated塊對valgrind是不可見的。 它只攔截malloc
, calloc
, free
, new
等。
令人困惑的是 , valgrind
會跟蹤一些mmap
-allocated區域! 例如,當malloc
選擇mmap
內存而不是使用堆時,會發生這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.