在Linux上如何使用核心转储和gdb来近似计算虚拟内存使用量(VSZ)?

5
我正在编写一个用于核心转储分析的工具,其中一件我想打印的事情是在转储时进程使用了多少虚拟内存。这些核心转储可能是由于崩溃或手动使用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,但似乎只能在进程运行时使用。

你有什么想法吗?


我刚刚尝试了“维护信息部分”,我得到了一个略大但类似的数量,即1,817,528字节。 - user379184
1个回答

1
在我的情况下,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 r-x--    [ anon ]
001c3000    100K r-x--  /lib/ld-2.5.so
001dc000      4K r-x--  /lib/ld-2.5.so
001dd000      4K rwx--  /lib/ld-2.5.so
001e0000   1256K r-x--  /lib/libc-2.5.so
0031a000      8K r-x--  /lib/libc-2.5.so
0031c000      4K rwx--  /lib/libc-2.5.so
0031d000     12K rwx--    [ anon ]
08048000     12K r-x--  /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 mapping的信息

(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]

你能展示更多关于这个过程的信息吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接