/proc/pids/maps

发布时间 2023-11-09 16:25:14作者: yooooooo

本实例中的用户空间地址从 0x00000000 到 0x80000000,从地址空间划分可知,从低到高依次是:

  • 可执行文件的代码段、数据段、BSS段。
  • 堆heap。
  • 文件映射和匿名映射,包括vdso、库的映射、mmap映射的内存等等。
  • 栈stack。

通过top或者procrank之类工具发现某个进程存在内存泄漏的风险,然后查看进程的maps信息,进而可以缩小泄漏点范围。

一般情况下泄漏点常在堆和文件/匿名映射区域。

对于堆,需要了解哪些函数申请的内存在堆中,然后加以监控相关系统调用。

对于文件映射,定位较简单,可以通过文件名找到对应代码。

对于匿名映射,则需要根据大小或者地址范围猜测用途。当然也可以通过strace 跟踪和maps对应找到对应的泄漏点。

起始地址-结束地址    属性  偏移地址 主从设备号 inode编号 文件名
00008000-00590000 r-xp 00000000 b3:01 1441836    /root/xxx----------------------------可执行文件的代码段,下面分别是只读和可读写的段。00590000-005b2000 r--p 00587000 b3:01 1441836    /root/xxx
005b2000-005c4000 rw-p 005a9000 b3:01 1441836    /root/xxx
005c4000-0280c000 rwxp 00000000 00:00 0          [heap]-------------------------------如果堆在业务稳定后,还继续单向增加,则可能存在泄漏。
2aaa8000-2aac5000 r-xp 00000000 b3:01 786621     /lib/ld-2.28.9000.so-----------------下面是最复杂的部分,存在各种各种样的内存使用情况,大体上有库映射、匿名内存映射、文件内存映射等。
2aac5000-2aac6000 r--p 0001c000 b3:01 786621     /lib/ld-2.28.9000.so
2aac6000-2aac7000 rw-p 0001d000 b3:01 786621     /lib/ld-2.28.9000.so
2aac7000-2aac8000 r-xp 00000000 00:00 0          [vdso]
2aac8000-2aaca000 rw-p 00000000 00:00 0...
2d9aa000-2d9c8000 r-xp 00000000 b3:01 656126     /usr/lib/libv4lconvert.so.0.0.0
2d9c8000-2d9c9000 ---p 0001e000 b3:01 656126     /usr/lib/libv4lconvert.so.0.0.0
2d9c9000-2d9ca000 r--p 0001e000 b3:01 656126     /usr/lib/libv4lconvert.so.0.0.0
2d9ca000-2d9cb000 rw-p 0001f000 b3:01 656126     /usr/lib/libv4lconvert.so.0.0.0
2d9cb000-2da23000 rw-p 00000000 00:00 0...
3e8aa000-3e90c000 rw-s 00000000 00:06 5243       /dev/mem_cma
3ea00000-3ea42000 rw-p 00000000 00:00 0
3ea42000-3eb00000 ---p 00000000 00:00 07fa4a000-7fa6b000 rwxp 00000000 00:00 0          [stack]--------------------------------栈的大小是可变的,但是不能超过RLIMIT_STACK规定的大小。