我有一个在特定行出现段错误的程序:
uint64_t small_num = *(uint64_t*)(smaller_base+index);
GDB 成功捕获了允许我调试问题的段错误。但是,如果我从 GDB 提示符运行该行,则不会发生内存访问冲突:
(gdb) p small_num = *(uint64_t*)(smaller_base+index)
谁能提供一些有关如何调试此问题的建议?我不知所措,因为我验证了 small_base+index 处的内存存在。会不会和选角有关?
提前致谢。
编辑:提供更多代码,但它真的很简单。我已经大量编辑代码以显示索引的要点。
uint64_t ** find_difference(unsigned char * larger_base,
uint64_t size,
unsigned char * smaller_base,
uint64_t tmap_size)
{
uint64_t len = size < tmap_size?size:tmap_size;
uint64_t index=0;
while(index<len)
{
uint64_t larger_num = *(uint64_t*)(larger_base+index);
uint64_t smaller_num = *(uint64_t*)(smaller_base+index);
if(larger_num > smaller_num)
{
... do stuff
}
index++;
}
...
}
编辑#2:现在我正在考虑它,指针取消引用是否可能超出 len?据我了解,x86 数字是从高地址到低地址存储的。因此在内存中,数字 0x01020304 存储为 0x04 0x03 0x02 0x01。这个对吗?如果这不是真的,那么尊重将超出缓冲区的末尾。但是,在 GDB 中,我验证了该地址是可访问的。