0

我理解当分配大于 MMAP_THRESHOLD 字节的内存块时,glibc malloc() 实现使用 mmap 将内存分配为私有匿名映射,并且这个 mmap 分配区域不会作为linux vma中[heap]的一部分。

那么是否有任何方法可以从 linux 内核模块中识别所有 glibc mmap 区域。?

例子 :

多次执行大于 MMAP_THRESHOLD 的 malloc 的测试程序之一显示 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]";
 }
4

1 回答 1

0

我相信您不应该从内核模块中转储应用程序的内存。您应该考虑使用应用程序检查点,请参阅此答案伯克利检查点重启库

您还可以考虑使用core内核中的转储工具。

于 2012-10-09T05:17:21.430 回答