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

Posted

技术标签:

【中文标题】在 Linux 上使用核心转储和 gdb 如何使用近似虚拟内存 (VSZ)?【英文标题】:How does one approximate virtual memory used (VSZ) using a core dump and gdb on Linux? 【发布时间】:2012-01-30 22:02:26 【问题描述】:

我正在编写一个用于核心转储分析的工具,我想打印的一件事是估计转储时进程使用了​​多少虚拟内存。这些核心转储可能是由于崩溃造成的,也可能是使用 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,但这似乎只有在进程正在运行时才有效。

有什么想法吗?

【问题讨论】:

我刚刚尝试了maintenance info sections,我得到了一个稍大但相似的 1,817,528 字节数。 【参考方案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 映射

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

你能提供更多关于这个过程的信息吗?

【讨论】:

以上是关于在 Linux 上使用核心转储和 gdb 如何使用近似虚拟内存 (VSZ)?的主要内容,如果未能解决你的问题,请参考以下文章

分析分段错误核心转储 (gdb)

在核心转储文件上使用 gdb 获取变量的值

GDB 和核心转储问题

如何获取详细的 valgrind 核心或使用 gdb 将调试附加到核心在启动时转储的进程?

进程的 GDB 全内存转储

比较 2 个 GDB 核心转储