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

标签 linux gdb

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

(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 - 如何在 Linux 上使用核心转储和 gdb 使用一个近似虚拟内存 (VSZ)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9071464/

相关文章:

c++ - qt 通过 qprocess 运行 shell 命令

linux - 为什么 zsh 不会自动完成自定义创建的脚本,而 bash 会自动完成?

linux - 在循环内调用 sftp 脚本时循环退出

c++ - 捕获异常时可以使用 gdb 进行回溯吗?

gdb - 如何计算用于 gdb 监视器命令的表达式?

linux - 在没有root权限的情况下更新ldconfig缓存

linux - 替换换行符

从 C 程序到 gdb 的命令

python - 编写 PythonGDB 扩展时尝试继承 gdb.Breakpoint 时出错

gdb - 如何在 GNU GAS ELF 输出中制作 GDB 可以破解但不算作函数的本地标签?