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

我在x86 Linux机器(内核2.6.35-22,如果有的话)上有一个死堆进程的全堆核心转储,我试图在GDB中进行debugging。

有没有一个我可以使用的GDB命令,意思是“显示一个由这个进程分配的所有内存地址区域的列表? 换句话说,我可以弄清楚在这个转储中我可以检查的所有可能的有效内存地址是什么?

我要问的原因是我需要search整个进程堆中的某个二进制string,为了使用find命令,我需要一个开始和结束地址。 从0x00到0xff的简单search不起作用,因为一遇到无法访问的地址就立即停止:

(gdb)find / w 0x10000000,0xff000000,0x12345678

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

所以我需要获取内存中所有可读地址区域的列表,以便我可以一次search一个。

(我需要这样做的原因是我需要查找内存中指向某个地址的所有结构。)

没有show memshow procinfo meminfo proc似乎做我所需要的。

在GDB 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 (例如在正式debugging期间)不起作用。

尝试maintenance info sections

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

1)在程序中运行gdb和核心文件

  $gdb ./test core 

2)inputinfo文件,看看核心文件中有哪些不同的段。

  (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个细分市场。 每个段都有地址的开始和地址的结束。 select任何细分来search数据。 例如,让我们selectload11并search一个模式。 Load11的起始地址为0x08049000,结束于0x804a000。

3)在段中search模式。

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

如果您没有可执行文件,则需要使用打印核心文件所有段的数据的程序。 然后你可以在一个地址search一个特定的数据。 我没有find任何程序,您可以在下面的链接中使用该程序打印核心或可执行文件的所有段的数据。

  http://emntech.com/programs/printseg.c 

我刚刚看到以下内容:

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

这里

它可能允许您search而不考虑内存是否可访问。

 (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 

这是从上面的phihag的评论,值得一个单独的答案。 这工作,但info proc没有从gcc-arm-none-eabi Ubuntu软件包arm-none-eabi-gdb v7.4.1.20130913-cvs。

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

maintenance info sections的问题是该命令试图从二进制的节标题中提取信息。 如果二进制文件被触发(例如通过sstrip ),或者当加载器在加载之后(例如RELRO的情况下)可能改变内存许可时,它会给出错误的信息, RELRO