跳过导航链接 | |
退出打印视图 | |
手册页第 1 部分:用户命令 Oracle Solaris 11 Information Library (简体中文) |
- 显示进程的地址空间的相关信息
/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 实用程序显示进程的地址空间的相关信息。
支持下列选项:
输出用于共享映射的匿名和交换预留空间。
指定要显示的地址空间子范围。address_range 是以下列格式之一指定的:
单个地址,将输出限制为包含该地址的段(或页面,如果提供了 -L 选项)。如果指定的地址对应于某个段的起始地址,则输出将始终包括整个段,即使指定了 -L 选项。
后跟逗号但没有结束地址的地址,将输出限制为从包含指定地址的段开始的所有段(或页面,如果提供了 -L 选项)。
由起始地址和结束地址指定的地址范围,将输出限制为从包含起始地址的段或页面到包含结束地址的段或页面之间的所有段(或页面,如果提供了 -L 选项)。
前接逗号但没有起始地址的地址范围,将输出限制为从第一个段(或页面,如果提供了 -L 选项)到包含指定地址的段(或页面,如果提供了 -L 选项)之间的所有段或页面。
强制。抓取目标进程,即使另一进程已掌握了控制权。
请参见用法。
显示未解析的动态链接程序映射名称。
输出其中包含为虚拟内存提供后备支持的物理内存的 lgroup。
输出进程的保留地址。
输出 HAT 页面大小信息。
显示每个映射的交换预留空间信息。有关更多信息,请参见“用法”。
显示每个映射的其他信息。有关更多信息,请参见“用法”。
pmap 实用程序显示进程的地址空间的相关信息。
/usr/bin/pmap [ -rslF ] [-A address_range] [ pid | core ] ...
缺省情况下,pmap 按映射被映射到进程的虚拟地址顺序显示所有映射。将显示映射大小、标志和被映射对象的名称。
可以使用 -A 选项将输出限制到指定的地址范围。指定的地址向上或向下舍入到段边界,输出包括由这些地址界定的段。
/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 的每个硬件转换页面大小的连续映射显示一行。下面的括号中显示的是列标题。
输出的第一列表示每个映射的起始虚拟地址。虚拟地址是以升序显示的。
每个映射的虚拟大小(以千字节为单位)。
为每个映射驻留的物理内存量(以千字节为单位),包括与其他地址空间共享的物理内存。
使用系统页面大小计数的与指定映射相关联的匿名内存的页面数。不包括与其他地址空间共享的匿名内存,除非指定了 -a 选项。
为包含通过 MAP_PRIVATE(请参见 mmap(2))映射的映射的“写入时复制”页面的进程堆、栈报告匿名内存。
映射内被锁定的页面数。典型示例有通过 mlock() 锁定的内存和通过 SHM_SHARE_MMU 创建的 System V 共享内存。
显示每个映射的虚拟内存权限。有效权限有:
进程可以读取映射。
进程可以写入映射。
进程可以执行驻留在映射内的指令。
可以显示为每个映射显示其他信息的标志:
映射是共享的,因此在所观察的地址空间中所做的更改将提交到映射的文件,且可以从共享该映射的所有其他进程中看到这些更改。
没有为此映射预留交换空间。使用 MAP_NORESERVE 创建的映射和 System V ISM 共享内存映射不预留交换空间。
核心文件中不存在映射数据(仅当应用于核心文件时适用)。有关配置核心文件内容的信息,请参见 coreadm(1M)。
包含为指定映射提供后备支持的物理内存的 lgroup。
每个映射的说明性名称。将为映射显示下列主要的名称类型:
映射的文件:对于进程与文件之间的映射,pmap 命令会尝试解析每个映射的文件名。如果无法解析文件名,pmap 将显示包含该文件的主设备号和从设备号,以及文件的文件系统 inode 编号。
匿名内存:将与文件系统内的任何已命名对象或文件都不相关的内存报告为 [ anon ]。
pmap 命令显示某些已知匿名内存映射的通用名称:
映射是进程堆。
映射是主栈。
映射是线程 n 的栈。
映射用作线程 n 的备用信号栈。
如果映射的通用名称未知,pmap 将 [ anon ] 显示为映射名称。
System V 共享内存:使用 System V 共享内存系统调用创建的映射是通过下面显示的名称报告的:
其他:其他对象(包括帧缓冲区等设备)的映射。对于其他被映射的对象,没有显示映射名称。
用于该映射的硬件地址转换的页面大小(以千字节为单位)。有关详细信息,请参见 memcntl(2)。
为该映射预留的交换空间量(以千字节为单位)。即,从由 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 具有 1032 千字节的驻留内存大小。不过,该 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
将返回以下退出值:
操作成功。
出现错误。
进程文件
proc 工具支持文件
有关下列属性的描述,请参见 attributes(5):
|
命令语法是 "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)