查看Unix/Linux进程内存分布
摘自:https://nanxiao.me/unix-process-memory-map/
在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
通过查看进程的内存分布,可以了解哪些地址是有效的,可写的;这对于调试有一定帮助。