我正在为核心转储分析编写一个工具,我想要打印的是估计转储时进程正在使用多less虚拟内存。 这些核心转储可能是由于崩溃或可以使用gcore手动获取(例如大小)。 本质上,我想打印相当于PS VSZ列。
我已经看了readelf和gdb,并专注于后者。 例如,我有一个简单的程序,只是挂起,我看到在PS:
$ ps auxwww | grep a.out USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 16644 0.0 0.0 4108 472 pts/5 S+ 13:51 0:00 ./a.out
我使用gcore作为核心,在这一点上它使用了4,206,592字节的VSZ。 然后,我写了一个快速的脚本,分析info target
输出和总结地址范围,我得到1,814,528字节。 我也尝试过info proc mappings
但似乎只有在进程运行时才有效。
有任何想法吗?
在我的情况下,gdb和ps的输出显示相同的信息
root 3976 0.0 0.0 1636 640 tty6 Ss+ 08:00 0:00 /sbin/mingetty tty6
pmap也显示相同的1636
3976: /sbin/mingetty tty6 00110000 4K rx-- [ anon ] 001c3000 100K rx-- /lib/ld-2.5.so 001dc000 4K rx-- /lib/ld-2.5.so 001dd000 4K rwx-- /lib/ld-2.5.so 001e0000 1256K rx-- /lib/libc-2.5.so 0031a000 8K rx-- /lib/libc-2.5.so 0031c000 4K rwx-- /lib/libc-2.5.so 0031d000 12K rwx-- [ anon ] 08048000 12K rx-- /sbin/mingetty 0804b000 4K rw--- /sbin/mingetty 08dd3000 132K rw--- [ anon ] b7f69000 8K rw--- [ anon ] b7f79000 4K rw--- [ anon ] bff4d000 84K rw--- [ stack ] total 1636K
这里是gdb info proc映射
(gdb) info proc mappings process 3976 cmdline = '/sbin/mingetty' cwd = '/' exe = '/sbin/mingetty' Mapped address spaces: Start Addr End Addr Size Offset objfile 0x110000 0x111000 0x1000 0x110000 [vdso] 0x1c3000 0x1dc000 0x19000 0 /lib/ld-2.5.so 0x1dc000 0x1dd000 0x1000 0x19000 /lib/ld-2.5.so 0x1dd000 0x1de000 0x1000 0x1a000 /lib/ld-2.5.so 0x1e0000 0x31a000 0x13a000 0 /lib/libc-2.5.so 0x31a000 0x31c000 0x2000 0x139000 /lib/libc-2.5.so 0x31c000 0x31d000 0x1000 0x13b000 /lib/libc-2.5.so 0x31d000 0x320000 0x3000 0x31d000 0x8048000 0x804b000 0x3000 0 /sbin/mingetty 0x804b000 0x804c000 0x1000 0x2000 /sbin/mingetty 0x8dd3000 0x8df4000 0x21000 0x8dd3000 0xb7f69000 0xb7f6b000 0x2000 0xb7f69000 0xb7f79000 0xb7f7a000 0x1000 0xb7f79000 0xbff4d000 0xbff62000 0x15000 0xbff4d000 [stack]
你能展示更多关于这个过程的信息吗?