GDB: 列出崩溃进程的所有映射内存区域

我从 x86 Linux 机器上的一个死进程(内核2.6.35-22,如果需要的话)获得了一个完整的堆内核转储,我正试图在 GDB 中进行调试。

是否有一个 GDB 命令,我可以使用,这意味着“给我一个列表,所有的内存地址区域分配的进程?”换句话说,我能够找出在这个转储中可以检查的所有可能的有效内存地址吗?

我这样问的原因是,我需要在 整个进程堆中搜索某个二进制字符串,为了使用 find命令,我需要有一个开始和结束地址。简单地从0x00搜索到0xff。.无法工作,因为 find遇到无法访问的地址时会立即停止:

(gdb) find/w 0x1000000,0xff00000, 0x12345678

警告: 无法访问0x105ef883的目标内存,停止 搜索。

所以我需要得到一个列表,列出内存中所有可读的地址区域,这样我就可以一次搜索一个地址区域。

(我需要执行 那个的原因是我需要找到内存中指向 的所有结构体的某个地址。)

show memshow procinfo meminfo proc都不能满足我的要求。

168374 次浏览

在广东发展银行7.2中:

(gdb) help info proc
Show /proc process information about any running process.
Specify any process id, or use the program being debugged by default.
Specify any of the following keywords for detailed info:
mappings -- list of mapped memory regions.
stat     -- list a bunch of random process info.
status   -- list a different bunch of random process info.
all      -- list all available /proc info.

您希望使用 info proc mappings,但是当没有 /proc时(例如在事后调试期间)它不能工作。

试试 maintenance info sections

我刚刚看到了以下情况:

set mem inaccessible-by-default [on|off]

给你

如果内存是可访问的,它可能允许您不加考虑地进行搜索。

如果您有程序和核心文件,您可以执行以下步骤。

1)使用 core 文件在程序上运行 gdb

 $gdb ./test core

2)输入信息文件,看看核心文件中有哪些不同的片段。

    (gdb)info files

样本输出:

    (gdb)info files


Symbols from "/home/emntech/debugging/test".
Local core dump file:
`/home/emntech/debugging/core', file type elf32-i386.
0x0055f000 - 0x0055f000 is load1
0x0057b000 - 0x0057c000 is load2
0x0057c000 - 0x0057d000 is load3
0x00746000 - 0x00747000 is load4
0x00c86000 - 0x00c86000 is load5
0x00de0000 - 0x00de0000 is load6
0x00de1000 - 0x00de3000 is load7
0x00de3000 - 0x00de4000 is load8
0x00de4000 - 0x00de7000 is load9
0x08048000 - 0x08048000 is load10
0x08049000 - 0x0804a000 is load11
0x0804a000 - 0x0804b000 is load12
0xb77b9000 - 0xb77ba000 is load13
0xb77cc000 - 0xb77ce000 is load14
0xbf91d000 - 0xbf93f000 is load15

对我来说,我有15个部分。每个段都有地址的开始和结束。选择要搜索数据的任何段。例如,让我们选择 load11并搜索模式。Load11的开始地址为0x08049000,结束地址为0x804a000。

3)在段中搜索模式。

(gdb) find /w 0x08049000 0x0804a000 0x8048034
0x804903c
0x8049040
2 patterns found

如果没有可执行文件,则需要使用一个程序来打印核心文件的所有段的数据。然后您可以在一个地址中搜索特定的数据。我没有找到这样的程序,你可以在下面的链接中使用这个程序,它可以打印出核心或者可执行文件的所有片段的数据。

 http://emntech.com/programs/printseg.c
(gdb) maintenance info sections
Exec file:
`/path/to/app.out', file type elf32-littlearm.
0x0000->0x0360 at 0x00008000: .intvecs ALLOC LOAD READONLY DATA HAS_CONTENTS

这是来自菲格以上的评论,值得一个单独的答案。这是可行的,但是 info proc不适用于 arm-none-eabi-gdb v7.4.1.20130913-cvs 的 gcc-arm-none-eabi Ubuntu 包。

还可以使用 info files列出进程二进制文件中加载的所有二进制文件的所有部分。

maintenance info sections的问题在于命令试图从二进制文件的节头中提取信息。如果二进制文件被触发(例如 sstrip) ,或者当加载程序可能在加载后更改内存权限(例如 RELRO)时,它提供了错误的信息,那么它就不能工作。