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