手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

pmap(1)

名称

pmap - 显示进程的地址空间的相关信息

用法概要

/usr/bin/pmap [-rslF] [-A address_range] [pid | core]...
/usr/bin/pmap -L [-rslF] [-A address_range] [pid] ...
/usr/bin/pmap -x [-aslF] [-A address_range] [pid | core]...
/usr/bin/pmap -S [-alF] [-A address_range] [pid | core]...

描述

pmap 实用程序显示进程的地址空间的相关信息。

选项

支持以下选项:

–a

输出用于共享映射的匿名和交换预留空间。

–A address_range

指定要显示的地址空间子范围。address_range 是以下列格式之一指定的:

start_addr

单个地址,将输出限制为包含该地址的段(或页面,如果提供了 –L 选项)。如果指定的地址对应于某个段的起始地址,则输出将始终包括整个段,即使指定了 –L 选项。

start_addr,

后跟逗号但没有结束地址的地址,将输出限制为从包含指定地址的段开始的所有段(或页面,如果提供了 –L 选项)。

start_addr,end_addr

由起始地址和结束地址指定的地址范围,将输出限制为从包含起始地址的段或页面到包含结束地址的段或页面之间的所有段(或页面,如果提供了 –L 选项)。

,end_addr

前接逗号但没有起始地址的地址范围,将输出限制为从第一个段(或页面,如果提供了 –L 选项)到包含指定地址的段(或页面,如果提供了 –L 选项)之间的所有段或页面。

–F

强制。抓取目标进程,即使另一进程已掌握了控制权。

请参见“用法”部分。

–l

显示未解析的动态链接程序映射名称。

–L

输出其中包含为虚拟内存提供后备支持的物理内存的 lgroup。

–r

输出进程的保留地址。

–s

输出 HAT 页面大小信息。

–S

显示每个映射的交换预留空间信息。有关更多信息,请参见“用法”部分。

–x

显示每个映射的其他信息。有关更多信息,请参见“用法”部分。

用法

pmap 实用程序显示进程的地址空间的相关信息。

进程映射
/usr/bin/pmap [ -rslF ] [-A address_range] [ pid | core ] ...

缺省情况下,pmap 按映射被映射到进程的虚拟地址顺序显示所有映射。将显示映射大小、标志和被映射对象的名称。

可以使用 –A 选项将输出限制到指定的地址范围。指定的地址向上或向下舍入到段边界,输出包括由这些地址界定的段。

进程 Lgroup 映射
/usr/bin/pmap -L [ -rslF ] [-A address_range] pid ...

可使用 –L 选项来确定包含为指定虚拟内存提供后备支持的物理内存的 lgroup。与 –A 选项一起使用时,指定的地址向上或向下舍入到页面边界,输出被限制到由这些地址界定的页面。

这可以与 plgrp(1) 结合使用来查明所关注的线程的主 lgroup 是否与内存所在位置一样,以及该位置是否应当为该线程的内存地址。lgrpinfo(1) 命令与该 pmap 选项结合使用时也很有用。它显示 lgroup 分层结构、内容和特征,这提供了内存分布于其中的各个 lgroup 的详细信息、这些 lgroup 相互之间的关系以及它们与所关注的任何其他 lgroup 的关系。

此外,可以通过使用 plgrp(1)pmadvise(1)madv.so.1(1) 更改线程和内存的布置。

线程匿名/被锁定映射的详细信息
/usr/bin/pmap -x [ -aslF ] [-A address_range] [ pid | core ] ...

–x 选项显示每个映射的其他信息。使用此选项可显示每个映射的大小、驻留物理内存 (resident physical memory, RSS) 量、匿名内存量以及锁定的内存量。此选项不包括内核地址空间因该进程而占用的匿名内存。

交换预留空间
/usr/bin/pmap -S [ -alF ] [-A address_range] [ pid | core ] ...

–S 选项显示每个映射的交换预留空间信息。

使用 –F 标志时应谨慎。在一个被调试的进程上施加两个控制进程可能会导致混乱。仅当主控制进程(通常是调试器)已停止了被调试的进程,并且在应用 proc 工具的可疑时刻主控制进程未在执行任何操作,才能保证安全。

显示格式

显示格式

除非指定了 -–s 或 -–L 选项,否则将为进程内的每个映射显示一行输出。使用 –s 选项时,将为每个硬件转换页面大小的连续映射显示一行。使用 –L 选项时,将为属于同一 lgroup 的连续映射显示一行。同时使用 –L–s 选项时,将为属于同一 lgroup 的每个硬件转换页面大小的连续映射显示一行。下面的括号中显示的是列标题。

虚拟地址 (Address)

输出的第一列表示每个映射的起始虚拟地址。虚拟地址是以升序显示的。

虚拟映射大小 (Kbytes)

每个映射的虚拟大小(以千字节为单位)。

驻留物理内存 (RSS)

为每个映射驻留的物理内存量(以千字节为单位),包括与其他地址空间共享的物理内存。

匿名内存 (Anon)

使用系统页面大小计数的与指定映射相关联的匿名内存的页面数。不包括与其他地址空间共享的匿名内存,除非指定了 –a 选项。

为包含通过 MAP_PRIVATE(请参见 mmap(2))映射的映射的“写入时复制”页面的进程堆、栈报告匿名内存。

锁定 (Locked)

映射内被锁定的页面数。典型示例有通过 mlock() 锁定的内存和通过 SHM_SHARE_MMU 创建的 System V 共享内存。

权限/标志 (Mode)

显示每个映射的虚拟内存权限。有效权限有:

r:

进程可以读取映射。

w:

进程可以写入映射。

x::

进程可以执行驻留在映射内的指令。

可以显示为每个映射显示其他信息的标志:

s:

映射是共享的,因此在所观察的地址空间中所做的更改将提交到映射的文件,且可以从共享该映射的所有其他进程中看到这些更改。

R:

没有为此映射预留交换空间。使用 MAP_NORESERVE 创建的映射和 System V ISM 共享内存映射不预留交换空间。

*:

核心文件中不存在映射数据(仅当应用于核心文件时适用)。有关配置核心文件内容的信息,请参见 coreadm(1M)

Lgroup (Lgrp)

包含为指定映射提供后备支持的物理内存的 lgroup。

映射名称 (Mapped File)

每个映射的说明性名称。将为映射显示下列主要的名称类型:

  • 映射的文件:对于进程与文件之间的映射,pmap 命令会尝试解析每个映射的文件名。如果无法解析文件名,pmap 将显示包含该文件的主设备号和从设备号,以及文件的文件系统 inode 编号。

  • 匿名内存:将与文件系统内的任何指定对象或文件都不相关的内存报告为 [ anon ]

    pmap 命令显示某些已知匿名内存映射的通用名称:

    [ heap ]

    映射是进程堆。

    [ stack ]

    映射是主栈。

    [ stack tid=n ]

    映射是线程 n 的栈。

    [ altstack tid=n ]

    映射用作线程 n 的备用信号栈。

    如果映射的通用名称未知,pmap[ anon ] 显示为映射名称。

  • System V 共享内存:使用 System V 共享内存系统调用创建的映射是通过下面显示的名称报告的:

    shmid=n:

    映射是 System V 共享内存映射。报告了创建映射时使用的共享内存标识符。

    ism shmid=n:

    映射是 System V 共享内存的“锁定共享内存”(ISM) 变体。ISM 映射是在设置了 SHM_SHARE_MMU 标志的情况下依照 shmat(2) 创建的(请参见 shmop(2))。

    dism shmid=n:

    映射是 ISM 的可分页变体。可分页的 ISM 是在设置了 SHM_PAGEABLE 标志的情况下依照 shmat(2) 创建的(请参见 shmop(2))。

  • 其他:其他对象(包括帧缓存器等设备)的映射。对于其他被映射的对象,没有显示映射名称。

页面大小 (Pgsz)

用于该映射的硬件地址转换的页面大小(以千字节为单位)。有关详细信息,请参见 memcntl(2)

交换空间 (Swap)

为该映射预留的交换空间量(以千字节为单位)。即,从由 swap –s 命令显示的总的可用预留交换空间池中扣除的交换空间。请参见 swap(1M)

示例

示例 1 显示进程映射

缺省情况下,pmap 为目标进程的地址空间内的每个映射输出一行。下面的示例显示了典型 bourne shell 的地址空间:


example$ pmap 102905
102905:    sh
00010000    192K r-x--  /usr/bin/ksh
00040000      8K rwx--  /usr/bin/ksh
00042000     40K rwx--    [ heap ]
FF180000    664K r-x--  /usr/lib/libc.so.1
FF236000     24K rwx--  /usr/lib/libc.so.1
FF23C000      8K rwx--  /usr/lib/libc.so.1
FF250000      8K rwx--    [ anon ]
FF260000     16K r-x--  /usr/lib/en_US.ISO8859-1.so.2
FF272000     16K rwx--  /usr/lib/en_US.ISO8859-1.so.2
FF280000    560K r-x--  /usr/lib/libnsl.so.1
FF31C000     32K rwx--  /usr/lib/libnsl.so.1
FF324000     32K rwx--  /usr/lib/libnsl.so.1
FF350000     16K r-x--  /usr/lib/libmp.so.2
FF364000      8K rwx--  /usr/lib/libmp.so.2
FF380000     40K r-x--  /usr/lib/libsocket.so.1
FF39A000      8K rwx--  /usr/lib/libsocket.so.1
FF3A0000      8K r-x--  /usr/lib/libdl.so.1
FF3B0000      8K rwx--    [ anon ]
FF3C0000    152K r-x--  /usr/lib/ld.so.1
FF3F6000      8K rwx--  /usr/lib/ld.so.1
FFBFC000     16K rw---    [ stack ]
 total     1864
示例 2 显示内存分配和映射类型

可使用 –x 选项提供有关每个映射的内存分配和映射类型的信息。为每个映射显示了驻留的、非共享匿名的和锁定的内存量:


example$ pmap -x 102908
102908:   sh
Address   Kbytes     RSS    Anon  Locked Mode   Mapped File
00010000      88      88       -       - r-x--  sh
00036000       8       8       8       - rwx--  sh
00038000      16      16      16       - rwx--    [ heap ]
FF260000      16      16       -       - r-x--  en_US.ISO8859-1.so.2
FF272000      16      16       -       - rwx--  en_US.ISO8859-1.so.2
FF280000     664     624       -       - r-x--  libc.so.1
FF336000      32      32       8       - rwx--  libc.so.1
FF380000      24      24       -       - r-x--  libgen.so.1
FF396000       8       8       -       - rwx--  libgen.so.1
FF3A0000       8       8       -       - r-x--  libdl.so.1
FF3B0000       8       8       8       - rwx--    [ anon ]
FF3C0000     152     152       -       - r-x--  ld.so.1
FF3F6000       8       8       8       - rwx--  ld.so.1
FFBFE000       8       8       8       - rw---    [ stack ]
--------   -----   -----   -----   ------
total Kb    1056    1016      56       -

通过使用每个映射的驻留内存计数和匿名内存计数可以估算进程的每个附加实例使用的增量内存量。

在上面的示例中,bourne shell 具有 1016 千字节的驻留内存大小。不过,该 shell 使用的大量物理内存是与 shell 的其他实例共享的。shell 的另一相同实例会尽可能地与该 shell 共享物理内存,并为任何非共享部分分配匿名内存。在上面的示例中,每个附加 bourne shell 使用了大约 56 千字节的附加物理内存。

下面的较复杂示例显示了包含不同映射类型的进程的输出格式。在此示例中,映射如下所示:


0001000: Executable text, mapped from 'maps' program

0002000: Executable data, mapped from 'maps' program

0002200: Program heap


0300000: A mapped file, mapped MAP_SHARED
0400000: A mapped file, mapped MAP_PRIVATE

0500000: A mapped file, mapped MAP_PRIVATE | MAP_NORESERVE

0600000: Anonymous memory, created by mapping /dev/zero

0700000: Anonymous memory, created by mapping /dev/zero
         with MAP_NORESERVE

0800000: A DISM shared memory mapping, created with SHM_PAGEABLE
         with 8MB locked via mlock(2)

0900000: A DISM shared memory mapping, created with SHM_PAGEABLE,
         with 4MB of its pages touched.

0A00000: A DISM shared memory mapping, created with SHM_PAGEABLE,
         with none of its pages touched.

0B00000: An ISM shared memory mapping, created with SHM_SHARE_MMU

example$ pmap -x 15492
15492:  ./maps
 Address  Kbytes     RSS    Anon  Locked Mode   Mapped File
00010000       8       8       -       - r-x--  maps
00020000       8       8       8       - rwx--  maps
00022000   20344   16248   16248       - rwx--    [ heap ]
03000000    1024    1024       -       - rw-s-  dev:0,2 ino:4628487
04000000    1024    1024     512       - rw---  dev:0,2 ino:4628487
05000000    1024    1024     512       - rw--R  dev:0,2 ino:4628487
06000000    1024    1024    1024       - rw---    [ anon ]
07000000     512     512     512       - rw--R    [ anon ]
08000000    8192    8192       -    8192 rwxs-    [ dism shmid=0x5]
09000000    8192    4096       -       - rwxs-    [ dism shmid=0x4]
0A000000    8192    8192       -    8192 rwxsR    [ ism shmid=0x2 ]
0B000000    8192    8192       -    8192 rwxsR    [ ism shmid=0x3 ]
FF280000     680     672       -       - r-x--  libc.so.1
FF33A000      32      32      32       - rwx--  libc.so.1
FF3A0000       8       8       -       - r-x--  libdl.so.1
FF3B0000       8       8       8       - rwx--    [ anon ]
FF3C0000     152     152       -       - r-x--  ld.so.1
FF3F6000       8       8       8       - rwx--  ld.so.1
FFBFA000      24      24      24       - rwx--    [ stack ]
-------- ------- ------- ------- -------
total Kb   50456   42256   18888   16384
示例 3 显示页面大小信息

可以使用 –s 选项为地址空间的每一部分显示硬件转换页面大小。(有关 Solaris 多页面大小支持的详细信息,请参见 memcntl(2))。

在下面的示例中,我们可以看到绝大部分映射使用 8 KB 的页面大小,而堆使用 4 MB 的页面大小。

请注意,相同页面大小的驻留页面的非连续区域报告为单独的映射。在下面的示例中,libc.so 库被报告为多个单独的映射,因为只有部分 libc.so 文本是驻留的:


example$ pmap -xs 15492
15492:  ./maps
 Address  Kbytes     RSS    Anon  Locked Pgsz Mode   Mapped File
00010000       8       8       -       -   8K r-x--  maps
00020000       8       8       8       -   8K rwx--  maps
00022000    3960    3960    3960       -   8K rwx--    [ heap ]
00400000    8192    8192    8192       -   4M rwx--    [ heap ]
00C00000    4096       -       -       -    - rwx--    [ heap ]
01000000    4096    4096    4096       -   4M rwx--    [ heap ]
03000000    1024    1024       -       -   8K rw-s-  dev:0,2 ino:4628487
04000000     512     512     512       -   8K rw---  dev:0,2 ino:4628487
04080000     512     512       -       -    - rw---  dev:0,2 ino:4628487
05000000     512     512     512       -   8K rw--R  dev:0,2 ino:4628487
05080000     512     512       -       -    - rw--R  dev:0,2 ino:4628487
06000000    1024    1024    1024       -   8K rw---    [ anon ]
07000000     512     512     512       -   8K rw--R    [ anon ]
08000000    8192    8192       -    8192    - rwxs-    [ dism shmid=0x5 ]
09000000    4096    4096       -       -   8K rwxs-    [ dism shmid=0x4 ]
0A000000    4096       -       -       -    - rwxs-    [ dism shmid=0x2 ]
0B000000    8192    8192       -    8192   4M rwxsR    [ ism shmid=0x3 ]
FF280000     136     136       -       -   8K r-x--  libc.so.1
FF2A2000     120     120       -       -    - r-x--  libc.so.1
FF2C0000     128     128       -       -   8K r-x--  libc.so.1
FF2E0000     200     200       -       -    - r-x--  libc.so.1
FF312000      48      48       -       -   8K r-x--  libc.so.1
FF31E000      48      40       -       -    - r-x--  libc.so.1
FF33A000      32      32      32       -   8K rwx--  libc.so.1
FF3A0000       8       8       -       -   8K r-x--  libdl.so.1
FF3B0000       8       8       8       -   8K rwx--    [ anon ]
FF3C0000     152     152       -       -   8K r-x--  ld.so.1
FF3F6000       8       8       8       -   8K rwx--  ld.so.1
FFBFA000      24      24      24       -   8K rwx--    [ stack ]
     -------- ------- ------- ------- -------
total Kb   50456   42256   18888   16384
示例 4 显示交换预留空间

可使用 –S 选项来描述进程的交换预留空间。将为进程内的每个映射显示预留的交换空间量。对于共享的映射,交换预留空间报告为零,因为这类预留空间仅在系统范围内计入一次。

example$ pmap -S 15492
15492:  ./maps
 Address  Kbytes    Swap Mode   Mapped File
00010000       8       - r-x--  maps
00020000       8       8 rwx--  maps
00022000   20344   20344 rwx--    [ heap ]
03000000    1024       - rw-s-  dev:0,2 ino:4628487
04000000    1024    1024 rw---  dev:0,2 ino:4628487
05000000    1024     512 rw--R  dev:0,2 ino:4628487
06000000    1024    1024 rw---    [ anon ]
07000000     512     512 rw--R    [ anon ]
08000000    8192       - rwxs-    [ dism shmid=0x5]
09000000    8192       - rwxs-    [ dism shmid=0x4]
0A000000    8192       - rwxs-    [ dism shmid=0x2]
0B000000    8192       - rwxsR    [ ism shmid=0x3]
FF280000     680       - r-x--  libc.so.1
FF33A000      32      32 rwx--  libc.so.1
FF3A0000       8       - r-x--  libdl.so.1
FF3B0000       8       8 rwx--    [ anon ]
FF3C0000     152       - r-x--  ld.so.1
FF3F6000       8       8 rwx--  ld.so.1
FFBFA000      24      24 rwx--    [ stack ]
-------- ------- -------
total Kb   50456   23496

可以使用交换预留空间信息估算每个附加进程使用的虚拟交换量。每个进程都使用全局虚拟交换池中的虚拟交换。全局交换预留空间是由 swap(1M) 命令的“avail”字段报告的。

示例 5 标记多线程进程中的栈
example$ pmap 121969
121969: ./stacks
00010000       8K r-x--  /tmp/stacks
00020000       8K rwx--  /tmp/stacks
FE8FA000       8K rwx-R    [ stack tid=11 ]
FE9FA000       8K rwx-R    [ stack tid=10 ]
FEAFA000       8K rwx-R    [ stack tid=9 ]
FEBFA000       8K rwx-R    [ stack tid=8 ]
FECFA000       8K rwx-R    [ stack tid=7 ]
FEDFA000       8K rwx-R    [ stack tid=6 ]
FEEFA000       8K rwx-R    [ stack tid=5 ]
FEFFA000       8K rwx-R    [ stack tid=4 ]
FF0FA000       8K rwx-R    [ stack tid=3 ]
FF1FA000       8K rwx-R    [ stack tid=2 ]
FF200000      64K rw---    [ altstack tid=8 ]
FF220000      64K rw---    [ altstack tid=4 ]
FF240000     112K rw---    [ anon ]
FF260000      16K rw---    [ anon ]
FF280000     672K r-x--  /usr/lib/libc.so.1
FF338000      24K rwx--  /usr/lib/libc.so.1
FF33E000       8K rwx--  /usr/lib/libc.so.1
FF35A000       8K rwxs-    [ anon ]
FF360000     104K r-x--  /usr/lib/libthread.so.1
FF38A000       8K rwx--  /usr/lib/libthread.so.1
FF38C000       8K rwx--  /usr/lib/libthread.so.1
FF3A0000       8K r-x--  /usr/lib/libdl.so.1
FF3B0000       8K rwx--    [ anon ]
FF3C0000     152K r-x--  /usr/lib/ld.so.1
FF3F6000       8K rwx--  /usr/lib/ld.so.1
FFBFA000      24K rwx--    [ stack ]
 total      1384
示例 6 显示 lgroup 内存分配

下面的示例按映射显示 lgroup 内存分配:


example$ pmap -L `pgrep nscd`
100095: /usr/sbin/nscd
00010000       8K r-x--   2 /usr/sbin/nscd
00012000      48K r-x--   1 /usr/sbin/nscd
0002E000       8K rwx--   2 /usr/sbin/nscd
00030000      16K rwx--   2   [ heap ]
00034000       8K rwx--   1   [ heap ]
         .
         .
         .
FD80A000      24K rwx--   2   [ anon ]
FD820000       8K r-x--   2 /lib/libmd5.so.1
FD840000      16K r-x--   1 /lib/libmp.so.2
FD860000       8K r-x--   2 /usr/lib/straddr.so.2
FD872000       8K rwx--   1 /usr/lib/straddr.so.2
FD97A000       8K rw--R   1   [ stack tid=24 ]
FD990000       8K r-x--   2 /lib/nss_nis.so.1
FD992000      16K r-x--   1 /lib/nss_nis.so.1
FD9A6000       8K rwx--   1 /lib/nss_nis.so.1
FD9C0000       8K rwx--   2   [ anon ]
FD9D0000       8K r-x--   2 /lib/nss_files.so.1
FD9D2000      16K r-x--   1 /lib/nss_files.so.1
FD9E6000       8K rwx--   2 /lib/nss_files.so.1
FDAFA000       8K rw--R   2   [ stack tid=23 ]
FDBFA000       8K rw--R   1   [ stack tid=22 ]
FDCFA000       8K rw--R   1   [ stack tid=21 ]
FDDFA000       8K rw--R   1   [ stack tid=20 ]
    .
    .
    .
FEFFA000       8K rw--R   1   [ stack tid=2 ]
FF000000       8K rwx--   2   [ anon ]
FF004000      16K rwx--   1   [ anon ]
FF00A000      16K rwx--   1   [ anon ]
    .
    .
    .
FF3EE000       8K rwx--   2 /lib/ld.so.1
FFBFE000       8K rw---   2   [ stack ]
 total      2968K



退出状态

将返回以下退出值:

0

操作成功。

非零

出现错误。

文件

/proc/*

进程文件

/usr/proc/lib/*

proc 工具支持文件

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
system/core-os
接口稳定性
请参见下文。

命令语法是 "Committed"(已确定)。–L 选项和输出格式是 "Uncommitted"(未确定)。

另请参见

ldd(1)lgrpinfo(1)madv.so.1(1)mdb(1)plgrp(1)pmadvise(1)proc(1)ps(1)coreadm(1M)prstat(1M)swap(1M)mmap(2)memcntl(2)meminfo(2)shmop(2)dlopen(3C)proc(4)attributes(5)