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

标签 debugging find gdb memory-segmentation

我正在尝试使用 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/

相关文章:

linux - GDB 窗口中的远程终端

arrays - 在数组中搜索数据 [Node.JS]

bash - 如果已使用单引号和双引号,则 find -exec 的解决方案

iphone - 为什么这在 XCode 调试窗口中不起作用 "po [myNsDateComponent weekday]"

java - 调用gdb调试java程序

javascript - 使用 browserify 进行调试 : calling functions and vars in console

c - 如何使用 CDT 进行指令级调试

visual-studio - g++ 的 -g 选项等价于 VS2010 cl 编译器?

unix - 如何将 find 命令返回的文件列表通过管道传递给 cat 以查看所有文件

java - Java 线程转储中的 nid 是什么意思?