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

时间:2011-04-17 03:14:44

标签: c linux gdb

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

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

我问的原因是我需要在整个进程堆中搜索某个二进制字符串,并且为了使用find命令,我需要一个开始和结束地址。简单地从0x00搜索到0xff ..不起作用,因为find一旦遇到无法访问的地址就会暂停:

  

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

     

警告:无法访问0x105ef883处的目标内存,暂停   搜索范围。

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

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

show memshow procinfo meminfo proc似乎无法满足我的需求。

6 个答案:

答案 0 :(得分:72)

在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时不起作用(例如在正面调试期间)。

请尝试maintenance info sections

答案 1 :(得分:15)

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

1)在程序上运行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

答案 2 :(得分:5)

我刚看到以下内容:

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

here

它可能允许您在不考虑内存是否可访问的情况下进行搜索。

答案 3 :(得分:4)

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

答案 4 :(得分:4)

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

答案 5 :(得分:0)

maintenance info sections的问题是该命令试图从二进制文件的节头中提取信息。如果二进制文件被触发(例如sstrip),或者加载程序在加载后可能更改内存权限(例如RELRO的情况),则它会提供错误的信息。