在Unix
平台,如果要查看某个进程的内存分布,可以使用gdb
附着在该进程,再使用“info proc mappings
”命令:
$ sudo gdb -p 1
......
(gdb) info proc mappings
process 1
Mapped address spaces:
Start Addr End Addr Size Offset objfile
0x400000 0x401000 0x1000 0x0 /usr/bin/runit
0x401000 0x480000 0x7f000 0x1000 /usr/bin/runit
0x480000 0x4aa000 0x2a000 0x80000 /usr/bin/runit
0x4ab000 0x4ae000 0x3000 0xaa000 /usr/bin/runit
0x4ae000 0x4b0000 0x2000 0x0
0x62d000 0x650000 0x23000 0x0 [heap]
0x7ffe5e3f3000 0x7ffe5e414000 0x21000 0x0 [stack]
0x7ffe5e4a4000 0x7ffe5e4a7000 0x3000 0x0 [vvar]
0x7ffe5e4a7000 0x7ffe5e4a8000 0x1000 0x0 [vdso]
另外在Linux
系统上,也可以使用pmap
命令:
$ sudo pmap -x 1
1: runit
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 4 4 0 r---- runit
0000000000401000 508 440 0 r-x-- runit
0000000000480000 168 124 0 r---- runit
00000000004ab000 12 12 12 rw--- runit
00000000004ae000 8 8 8 rw--- [ anon ]
000000000062d000 140 8 8 rw--- [ anon ]
00007ffe5e3f3000 132 12 12 rw--- [ stack ]
00007ffe5e4a4000 12 0 0 r---- [ anon ]
00007ffe5e4a7000 4 4 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 988 612 40
通过查看进程的内存分布,可以了解哪些地址是有效的,可写的;这对于调试有一定帮助。