我理解当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc()实现使用mmap将内存分配为私有匿名映射,并且此mmap分配区域不会作为 [heap]的一部分出现在linux vma。
那么有没有方法可以从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]";
}
答案 0 :(得分:0)
我相信你不应该从内核模块转储你的应用程序的内存。您应该考虑使用application checkpointing,请参阅this answer和Berkley checkpoint restart library
您还可以考虑在内核中使用core
转储工具。