pmap 不支持 -d 选项,因其未被 gnu procps 官方定义;正确查看脏页应使用 pmap -x(估算)或 /proc//smaps 中的 dirty: 行(精确)。

pmap -d 并不是一个标准的 Linux 命令选项。Linux 中的 pmap 工具**不支持 -d 参数**,执行 pmap -d <pid></pid> 会报错:invalid option -- 'd' 或直接显示帮助信息。
为什么 pmap 没有 -d 选项
GNU procps 工具集(包含 pmap)的官方文档和源码中均未定义 -d 选项。常见误传可能源于混淆了以下内容:
-
pmap -x:显示扩展信息(RSS、PSS、Dirty 等列),其中 “Dirty” 列即为脏页大小(KB); -
/proc/<pid>/smaps</pid>文件中的Dirty:行,精确记录每个内存映射区域的脏页字节数; - 某些定制化或旧版调试工具(如内核调试补丁、厂商私有工具)可能添加过类似功能,但非通用 Linux 发行版标配。
正确查看进程各段脏页映射的方法
要获取进程运行中各内存映射区域(代码段、堆、动态库、mmap 区等)的脏页详情,应使用以下标准方式:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
用 pmap -x 显示近似脏页统计:
pmap -x <pid></pid>输出中,“Dirty” 列单位为 KB,表示该映射区域当前被修改且尚未写回磁盘/交换区的物理内存页大小(注意:该值是估算值,基于内核mm_struct的粗略统计,对匿名映射较准,对文件映射可能为 0 或不准确); -
读取 /proc/
/smaps 获取精确脏页数据 :
每个内存映射段后都有一组详细字段,查找以Dirty:开头的行(单位 KB),例如:7f8b2c000000-7f8b2c021000 rw-p 00000000 00:00 0 [heap]<br>Dirty: 124 kB
此值由内核精确维护,适用于所有映射类型(包括私有匿名、共享匿名、私有文件映射); -
结合 grep 和 awk 快速提取脏页信息:
awk '/^7f|^Dirty:/ {if (/^7f/) addr=$1; else if (/Dirty:/) print addr, $2, $3}' /proc/<pid>/smaps</pid>
可按需过滤并关联地址范围与脏页大小。
脏页统计的实际意义与限制
脏页数据反映的是进程当前在内存中被修改但未落盘的页面数量,对性能分析和内存泄漏排查有参考价值,但需注意:
- 脏页不等于“泄露”——正常堆分配、栈增长、mmap 写入都会产生脏页;
- 文件映射(MAP_PRIVATE)的写时复制页,在首次写入后变为脏页,但不会触发回写;
- 内核 v5.0+ 中
smaps新增Dirty_Clean:和Dirty_Anon:等细分字段,可进一步区分脏页来源; - 频繁脏页增长 + RSS 持续上升 + 缺乏释放,才提示可能存在内存管理异常。
替代方案:使用 smaps_rollup 或 pagemap(进阶)
若需聚合统计或定位具体脏页物理帧:
-
/proc/<pid>/smaps_rollup</pid>(内核 4.14+)提供全进程脏页总和:grep Dirty /proc/<pid>/smaps_rollup</pid>→ 得到Dirty: 123456 kB; - 通过
/proc/<pid>/pagemap</pid>配合内核符号可逐页查询是否为脏页(需 root、编程解析,适合深度调试)。










