pmap是linux下查看进程虚拟内存映射的命令行工具,直接显示起始地址、大小、权限、偏移、设备号、inode及映射路径(如[heap]、[stack]、共享库等);不解析malloc小块内存或堆内部结构。

什么是 pmap,它能直接显示哪些内存段信息
pmap 是 Linux 下查看进程虚拟内存映射的命令行工具,本质是读取 /proc/[pid]/maps 并格式化输出。它不解析符号或堆分配细节,只反映内核维护的 VMA(Virtual Memory Area)结构:包括起始/结束地址、权限(rw-p)、偏移、设备号、inode 和映射路径(如 [heap]、[stack]、共享库路径等)。
注意:pmap 默认不显示匿名映射的用途(比如 malloc 分配的堆块),也无法区分 mmap(MAP_ANONYMOUS) 和 brk 扩展的 heap —— 它们在输出里都可能标为 [heap] 或无名段。
如何用 pmap 查看指定进程的完整内存布局
执行 pmap -x [pid] 是最常用方式,其中 -x 启用扩展模式,额外显示 RSS、PSS、Dirty 字节数,便于判断真实内存占用。
- 先用
ps aux | grep your_process或pgrep -f "pattern"获取目标pid - 运行
pmap -x [pid],输出按地址升序排列,每行对应一个 VMA - 关键列含义:
Address(起始地址)、Kbytes(大小)、RSS(常驻物理内存)、Mode(权限,如r-xp表示可读可执行不可写且私有) - 特殊标记段:
[heap]通常指 brk 区域;[stack]是主线程栈;[vdso]、[vvar]是内核提供给用户态的只读页;以路径结尾的行是文件映射(如/lib/x86_64-linux-gnu/libc.so.6)
为什么 pmap 输出里看不到 malloc 分配的小块内存地址
pmap 展示的是内核视角的内存段,不是 libc 的堆管理器(如 ptmalloc)视角。malloc 小块内存不会触发 mmap,而是从已映射的 [heap] 段中切分,这些切分点不生成新的 VMA,因此不会单独出现在 pmap 输出中。
若想定位具体 malloc 块,需结合其他手段:
- 用
gdb -p [pid]+info proc mappings看原始/proc/[pid]/maps - 在程序中调用
malloc_stats()或启用MALLOC_TRACE记录分配行为 - 使用
valgrind --tool=massif进行堆分析(会显著降低性能)
单纯依赖 pmap 判断“某次 malloc 分配在哪”是无效的。
常见误用与权限问题
非 root 用户运行 pmap 查看其他用户进程时,可能遇到 Permission denied 错误 —— 这是因为 /proc/[pid]/maps 默认仅对进程所有者和 root 可读。
- 普通用户只能查自己启动的进程,或通过
sudo pmap [pid](需 sudo 权限) -
pmap对已退出但尚未被回收的僵尸进程(Z状态)会报No such process,因为其/proc/[pid]目录已消失 - 避免用
pmap -XX(不存在的选项),部分旧版pmap不支持-X(显示 MAP_LOCKED 等标志),建议优先用-x和-XX(如有)验证版本兼容性
真正需要分析细粒度内存分布时,pmap 只是第一站;后续往往得靠 /proc/[pid]/smaps(含每个 VMA 的详细统计)或动态追踪工具补全。











