簡體   English   中英

從Linux內核模塊識別glibc mmap區域(VMA)

[英]identifying glibc mmap areas (VMA's) from a Linux kernel module

我了解,當分配大於MMAP_THRESHOLD字節的內存塊時,glibc malloc()實現使用mmap將內存分配為私有匿名映射,並且該mmap分配區域不會成為linux vma中[heap]的一部分。

那么,有什么方法可以從Linux內核模塊中識別所有glibc mmap區域。

例如:

多次執行malloc大於MMAP_THRESHOLD的測試程序之一顯示cat / proc / pid / maps輸出為

00013000-00085000 rw-p 00000000 00:00 0          [heap]
40000000-40016000 r-xp 00000000 00:0c 14107305   /lib/arm-linux-gnueabi/ld-2.13.so
4025e000-4025f000 r--p 00001000 00:0c 14107276   /lib/arm-linux-gnueabi/libdl-2.13.so
4025f000-40260000 rw-p 00002000 00:0c 14107276   /lib/arm-linux-gnueabi/libdl-2.13.so
.....
.....
40260000-40261000 ---p 00000000 00:00 0 
40261000-40a60000 rw-p 00000000 00:00 0
40a60000-40a61000 ---p 00000000 00:00 0 
40a61000-42247000 rw-p 00000000 00:00 0 
beed8000-beef9000 rw-p 00000000 00:00 0          [stack]

在這幾個(40a61000-42247000,40261000-40a60000)中實際上是glibc mmap區域,因此從Linux內核模塊中可以找到任何識別此區域的方法,如下面的代碼所示,用於識別堆棧和堆?

if (vma->vm_start <= mm->start_brk &&
                            vma->vm_end >= mm->brk) {
        name = "[heap]";
 } else if (vma->vm_start <= mm->start_stack &&
                         vma->vm_end >= mm->start_stack) {
       name = "[stack]";
 }

我相信您不應該從內核模塊中轉儲應用程序的內存。 您應該考慮使用應用程序檢查點 ,請參見此答案Berkley檢查點重新啟動庫

您也可以考慮使用core內部的core轉儲工具。

暫無
暫無

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

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