GDB:如何查看可访问的内存地址?

And*_*ndy 2 memory debugging assembly gdb postmortem-debugging

假设,在调试会话中,我有一个地址,不幸的是它指向一些垃圾.我想检查周围的记忆,看看附近有什么.正如所料,发生以下错误:

(gdb) x/64 $t5
0x842da7ac:     Cannot access memory at address 0x842da7ac
Run Code Online (Sandbox Code Playgroud)

所以,问题是:有没有办法读取一系列地址,其中一些无效?

(更准确地说,我怎么知道上面的例子$t5+n中某些人的有效地址0 < n <= 64?)

Emp*_*ian 6

您无法读取无效地址(显然).

在某些操作系统上,您可以在GDB中停止进程时向操作系统查询有效地址.例如,在Linux上cat /proc/<pid>/maps将为您提供有关哪些地址有效(以及它们有效的访问模式)的信息.其他操作系统可能具有类似的机制.

由于您标记了您的问题post-mortem,因此您无法使用上述机制; 但是你必须有一个core文件.在Linux(和其他ELF系统)上,readelf -l core将告诉您哪些内存区域被写入内核,这通常可以让您清楚地了解崩溃时哪些内存有效.但是,通常不会写入只读映射core,因此您可能无法在readelf输出中看到此类映射.

所有现代操作系统都使用分页,并且页面至少1K(虽然4K更常见),因此您可以判断最接近的内存$t5可能是有效的0x842da800,因此n >= 84(字节).

最后,如果你要求GDB检查64个单词,并且GDB无法检查第一个单词,它将停止.

但是,如果您正在使用GDB-7.x,您可以要求GDB在Python中一次检查一个单词,如果GDB无法检查该特定单词,则会抛出Python异常.但是既然你可以捕获Python异常,那么在Python中编写一个实现"检查下N个字,忽略任何不可读的字"的脚本是微不足道的(我相信它会回答你的"如何做到这一点"的问题).

  • 不,您不能:/ proc/<pid>/maps显示区域,例如sbrk和mmap,它们*不属于GDB知道的任何部分. (2认同)