2014-11-16 117 views
1

我有326部類似如下什麼是在/ proc/PID/smaps(Linux版)的「rwxp」部分

33300000-33500000 rwxp 33300000 00:00 0 
Size:    2048 kB 
Rss:    620 kB 
Shared_Clean:   0 kB 
Shared_Dirty:   0 kB 
Private_Clean:  244 kB 
Private_Dirty:  376 kB 

我想知道C++的GCC泄漏方案是什麼樣的分配原因加法2MB可寫代碼段到程序。 通常我會看到這些部分被用作線程的堆棧內存,但它們的大小是10 MB。

回答

2

經過更多的研究,我發現這個過程是使用malloc分配大內存塊。
但是,當malloc發現所需的分配大小對於堆太大(請參閱MMAP_THRESHOLD)時,它會通過調用mmap來分配內存。
在一天結束時,它是一個正常的內存泄漏,除了分配特別大,並導致直接mmap調用。

+0

你知道爲什麼這些頁面被標記爲可執行嗎?我不認爲'malloc'將它的頁面標記爲可執行文件。 – Jezz

+0

http://stackoverflow.com/questions/6315296/whats-the-protection-flags-of-memory-allocated-by-malloc添加一些關於它的信息@Jezz –

4
r = read 
w = write 
x = execute 
s = shared 
p = private (copy on write) 
+0

我知道每個字母的意思,但我感興趣什麼樣的分配將添加此部分。它是一個堆棧區嗎?通常代碼是隻讀的,這是正常的堆?由於 –

+0

我建議看看[這裏](http://books.google.co.in/books?id=-6zvRFEfQ24C&pg=PT553&lpg=PT553&dq=rwxp&source=bl&ots=8EgEDlZhUH&sig=TXAz0866Edil4kKhKyMqLKk6ez8&hl=en&sa=X&ei=imVoVKTnLYfbuQS754J4&ved=0CFIQ6AEwCQ# v = onepage&q = rwxp&f = false)以供進一步參考。 – Skynet

3

通常我看到它被用作堆棧存儲器線程

這樣的部分是,它是非常可能的,你正在泄漏線程。您可以通過查看/proc/<pid>/task並檢查是否有超過您預期的326個線索來確認此情況。或者,GDB info thread也會列出所有線程。

注意:您的堆棧是可執行的,這意味着您的二進制文件或其中一個必需的共享庫中沒有GNU_STACK段,這通常是一個壞主意。

但他們是10 MB大。

堆棧段的大小取決於電流ulimit -s設置,以及任何setrlimit(..., RLIMIT_STAck, ...)pthread_attr_setstacksize()調用,應用程序本身可以執行。

+0

感謝您的回答。經過更多的研究後,我們的情況變成了與我不同的場景,但你的回答將會幫助別人。 –