Kor*_*kçu 5 debugging gdb find memory-segmentation
我正在尝试使用gdb在KMines中查找当前的标志计数.我知道我应该首先寻找内存映射以避免不存在的内存位置.所以我运行info proc mappings
命令来查看内存段.我0xd27000-0x168b000
从结果中获取了一个随机内存gap()并执行了如下命令:find 0x00d27000, 0x0168b000, 10
但我得到了warning: Unable to access 1458 bytes of target memory at 0x168aa4f, halting search.
错误.虽然地址0x168aa4f介于0xd27000和0x168b000之间,但gdb表示它无法访问它.为什么会这样?我该怎么做才能避免这种情况?或者有没有办法忽略未映射/不可访问的内存位置?
编辑:我试图将地址0x168aa4f的值设置为1并且它可以工作,因此gdb实际上可以访问该地址,但在与find命令一起使用时会出错.但为什么?
我想我已经解决了自己的问题,我无法相信解决方案有多简单.我唯一做的就是将第二个参数的值减一.因此代码应该是find 0x00d27000, 0x0168afff, 10
因为linux通过使用[x,y)格式的映射来分配内存,所以如果行中的内容root/proc/pid/maps
是这样的话;
01a03000-0222a000 rw-p
Run Code Online (Sandbox Code Playgroud)
分配的内存包括0x01a03000但不包括0x0222a000.希望我的这个愚蠢的错误能帮助某人:D
编辑:问题的根源是在target.c中实现的算法(我的意思是gdb的源代码)算法读取内存并将其作为块大小为16000字节进行搜索.因此,即使块的最后一个字节无效,gdb也会将整个块丢入垃圾桶,甚至不会提供有关无效字节的任何正确信息,它只会报告当前块的开头.