我正在尝试使用 gdb 查找 KMines 中的当前标志计数。我知道我应该首先查找内存映射以避免不存在的内存位置。因此,我运行 info proc mappings
命令来查看内存段。我从结果中选取了一个随机内存间隙 (0xd27000-0x168b000
),并执行如下 find 命令:find 0x00d27000, 0x0168b000, 10
但我收到了警告:无法访问 0x168aa4f 处的 1458 字节目标内存,正在停止搜索。
错误。虽然地址0x168aa4f在0xd27000和0x168b000之间,但gdb表示无法访问它。为什么会出现这种情况?我该怎么做才能避免这种情况?或者有没有办法忽略未映射/无法访问的内存位置?
编辑:我尝试将地址 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 字节大小的 block 形式读取和搜索内存。因此,即使 block 的最后一个字节无效,gdb 也会将整个 block 扔进垃圾箱,甚至不会提供有关无效字节的任何正确信息,它只报告当前 block 的开头。
关于debugging - GDB查找命令错误 "warning: Unable to access x bytes of target memory at y, halting search",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34819167/