GDB 查找命令错误 "warning: Unable to access x bytes of target memory at y, halting search"

GDB find command error "warning: Unable to access x bytes of target memory at y, halting search"

我正在尝试使用 gdb 在 KMines 中查找当前标志计数。我知道我应该首先寻找内存映射以避免不存在的内存位置。所以我用运行info proc mappings命令查看内存段。我从结果中拾取了一个 运行dom 内存间隙(0xd27000-0x168b000)并执行了这样的查找命令:find 0x00d27000, 0x0168b000, 10

但是我遇到了 warning: Unable to access 1458 bytes of target memory at 0x168aa4f, halting search. 错误。尽管地址 0x168aa4f 在 0xd27000 和 0x168b000 之间,但 gdb 表示它无法访问它。为什么会这样?我该怎么做才能避免这种情况?或者有没有办法忽略 unmapped/unaccessible 内存位置?

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

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

01a03000-0222a000 rw-p

分配的内存包括0x01a03000但不包括0x0222a000。希望我的这个愚蠢的错误能帮助别人 :D

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