簡體   English   中英

Mmap和valgrind,mmap不會增加堆大小

[英]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是不可見的。 它只攔截malloccallocfreenew等。


令人困惑的valgrind 跟蹤一些mmap -allocated區域! 例如,當malloc選擇mmap內存而不是使用堆時,會發生這種情況。

暫無
暫無

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

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