【发布时间】:2013-04-19 12:49:19
【问题描述】:
我有一个程序在特定行出现段错误:
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++;
}
...
}
Edit#2:现在我正在考虑它,指针解引用是否可能超出 len?据我了解,x86 数字是从高地址到低地址存储的。因此在内存中,数字 0x01020304 存储为 0x04 0x03 0x02 0x01。它是否正确?如果这不是真的,那么尊重将超出缓冲区的末尾。但是,在 GDB 中,我验证了该地址是可访问的。
【问题讨论】:
-
上下文中的更多代码会对我们有所帮助。
-
请详细说明smaller_base和index类型。