代码之家  ›  专栏  ›  技术社区  ›  Some Name

了解内存映射

  •  0
  • Some Name  · 技术社区  · 7 年前

    我对C编程和研究不断增加的RSS大小非常陌生。怀疑是内存泄漏。我看着 /proc/<pid>/maps 发现了以下情况:

    f8000000-fb180000 rw-p 00000000 00:00 0
    fb180000-fd580000 ---p 00000000 00:00 0
    fd580000-fdc80000 rw-p 00000000 00:00 0
    fdc80000-100000000 ---p 00000000 00:00 0
    100000000-1005a0000 rw-p 00000000 00:00 0
    1005a0000-140000000 ---p 00000000 00:00 0
    7fb45d1dd000-7fb45d1e0000 ---p 00000000 00:00 0
    7fb45e0ec000-7fb45e0ef000 ---p 00000000 00:00 0
    7fb45e0ef000-7fb45e1ed000 rw-p 00000000 00:00 0
    7fb45e1ed000-7fb45e1f0000 ---p 00000000 00:00 0
    7fb45e1f0000-7fb45e2ee000 rw-p 00000000 00:00 0
    7fb45e2ee000-7fb45e2f1000 ---p 00000000 00:00 0
    7fb45e2f1000-7fb45e3ef000 rw-p 00000000 00:00 0
    7fb45e3ef000-7fb45e3f2000 ---p 00000000 00:00 0
    7fb45e3f2000-7fb45e4f0000 rw-p 00000000 00:00 0
    7fb45e4f0000-7fb45e4f3000 ---p 00000000 00:00 0
    7fb45e4f3000-7fb45e5f1000 rw-p 00000000 00:00 0
    7fb45e5f1000-7fb45e5f4000 ---p 00000000 00:00 0
    7fb45e5f4000-7fb45e6f2000 rw-p 00000000 00:00 0
    7fb45e6f2000-7fb45e6f5000 ---p 00000000 00:00 0
    7fb45e6f5000-7fb45e7f3000 rw-p 00000000 00:00 0
    7fb45e7f3000-7fb45e7f6000 ---p 00000000 00:00 0
    7fb45e7f6000-7fb45e8f4000 rw-p 00000000 00:00 0
    7fb45e8f4000-7fb45e8f7000 ---p 00000000 00:00 0
    //Tons of the similar entries...
    7fb71652b000-7fb71652c000 rw-p 0001a000 08:01 2187                       /lib/x86_64-linux-gnu/libpthread-2.27.so
    7fb716568000-7fb71656f000 r--s 00000000 08:01 5020                       /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
    7fb716759000-7fb71675a000 rw-p 00000000 00:00 0
    7ffc5f781000-7ffc5f7a2000 rw-p 00000000 00:00 0                          [stack]
    7ffc5f7c7000-7ffc5f7ca000 r--p 00000000 00:00 0                          [vvar]
    7ffc5f7ca000-7ffc5f7cc000 r-xp 00000000 00:00 0                          [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    

    我注意到的是 /proc/<pid>/映射 条目包括:

    7fb45e7f3000-7fb45e7f6000 ---p 00000000 00:00 0
    

    这是什么意思?这不意味着系统分配器释放它获得的内存吗?

    是否有方法检查地址处的内存内容,例如 7fb45e5f4000-7fb45e6f2000 在运行时?

    我尝试使用gdb附加到正在运行的进程,并查看内存。

    (gdb) x /1xg 0x7fb45e1ed000
    0x5e1ed000:     Cannot access memory at address 0x5e1ed000
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Nominal Animal    7 年前

    条目像

    7fb45e0ec000-7fb45e0ef000 ---p 00000000 00:00 0
    7fb45e0ef000-7fb45e1ed000 rw-p 00000000 00:00 0
    

    看起来像线程堆栈及其关联的保护页。

    看起来你创建了很多线程,但都没有通过 pthread_join() 或通过 pthread_detach() (或在分离状态下创建它们)。

    必须获取未分离的线程才能将其资源(特别是堆栈)返回到操作系统。