我从x86 Linux机器上的一个死进程(内核2.6.35-22,如果有必要的话)中得到了一个完整的堆核心转储,我正试图在GDB中调试它.

是否有一个GDB命令可以用来表示"向我显示此进程分配的所有内存地址区域的列表?"换句话说,我能找出我可以在这个转储中判断的所有可能的有效内存地址吗?

我问这个问题的原因是,我需要在entire process heap中搜索某个二进制字符串,为了使用find命令,我需要有一个起始地址和结束地址.只需从0x00搜索到0xff..不起作用,因为find遇到无法访问的地址时会立即停止:

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

警告:无法访问0x105ef883处的目标内存,正在停止

因此,我需要获得内存中所有可读地址区域的列表,以便可以一次搜索一个地址区域.

(我需要做that的原因是我需要在内存中找到指向某个地址的所有 struct .)

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时(例如在事后调试期间),它不起作用.

试试maintenance info sections吧.

C++相关问答推荐

-O and -wrap的行为

理解C中的指针定义

Apple Libm的罪恶功能

segfault在C中使用getline()函数

与unions 的未定义行为

为什么写入系统调用打印的字符数不正确?

在函数中使用复合文字来初始化C语言中的变量

为什么I2C会发送错误的数据?

错误Cygwin_Except::Open_stackdupfile:正在转储堆栈跟踪是什么?

每次除以或乘以整数都会得到0.0000

cairo 剪辑区域是否存在多个矩形?

C整型和_泛型.哪些类型是兼容的?

如何在VSCode中创建和使用我自己的C库?

Linux分段故障(核心转储)

unions 的原子成员是个好主意吗?

Makefile无法将代码刷新到ATmega328p

分支预测和UB(未定义的行为)

GnuCobol 使用 double 类型的参数调用 C 函数

memcmp 是否保证按顺序比较字节?

比 * 更快的乘法