Debugging GDB查找命令错误“;警告:无法在y处访问x字节的目标内存,正在停止搜索“;

Debugging GDB查找命令错误“;警告:无法在y处访问x字节的目标内存,正在停止搜索“;,debugging,find,gdb,memory-segmentation,Debugging,Find,Gdb,Memory Segmentation,我试图通过使用gdb查找KMines中的当前标志计数。我知道我应该首先寻找内存映射,以避免不存在的内存位置。所以我运行了info-proc-mappings命令来查看内存段。我从结果中提取了一个随机内存间隙(0xd2700-0x168b000),并执行如下的find命令:find 0x00d2700,0x0168b000,10 但是我得到了警告:无法访问0x168aa4f上1458字节的目标内存,停止搜索。错误。虽然地址0x168aa4f介于0xd27000和0x168b000之间,但gdb表示

我试图通过使用gdb查找KMines中的当前标志计数。我知道我应该首先寻找内存映射,以避免不存在的内存位置。所以我运行了
info-proc-mappings
命令来查看内存段。我从结果中提取了一个随机内存间隙(
0xd2700-0x168b000
),并执行如下的find命令:
find 0x00d2700,0x0168b000,10

但是我得到了
警告:无法访问0x168aa4f上1458字节的目标内存,停止搜索。
错误。虽然地址0x168aa4f介于0xd27000和0x168b000之间,但gdb表示无法访问它。为什么会发生这种情况?我能做些什么来避免这种情况?或者有没有办法忽略未映射/不可访问的内存位置


编辑:我尝试将地址0x168aa4f的值设置为1,它可以工作,因此gdb实际上可以访问该地址,但与find命令一起使用时会出现错误。但是为什么呢?

我想我已经解决了我自己的问题,我不敢相信这个解决方案是多么简单。我所做的唯一一件事就是将第二个参数的值减少一。因此,代码应该是
find 0x00d2700,0x0168afff,10
,因为linux使用[x,y]格式的映射分配内存,所以如果
root/proc/pid/maps
中的行是这样说的

01a03000-0222a000 rw-p
分配的内存包括0x01a03000,但不是0x0222a000。希望我这个愚蠢的错误能帮助别人:D

编辑:问题的根源是target.c(我指的是gdb的源代码)中实现的算法该算法以16000字节大小的块的形式读取和搜索内存。因此,即使块的最后一个字节无效,gdb也会将整个块扔进垃圾箱,甚至不会给出关于无效字节的任何正确信息,它只报告当前块的开始。