发生SEGFULT时,GDB断开线路,但SEGFULT后运行的线路未显示违规
我有一个程序,它在一个特定的行上进行分段: uint64\u t较小的数量=*(uint64\u t*)(较小的基数+指数) GDB成功捕获segfault,允许我调试问题。但是,如果从GDB提示符运行该行,则不会发生内存访问冲突: (gdb)p较小的基数=*(uint64+t*)(较小的基数+指数) 有人能就如何调试这个问题提供一些建议吗?我不知所措,因为我验证了较小的_base+索引中的内存存在。可能是演员的原因吗 提前谢谢 编辑:提供更多的代码,但实际上就是这么简单。我对代码进行了大量编辑,以显示索引的意义发生SEGFULT时,GDB断开线路,但SEGFULT后运行的线路未显示违规,gdb,segmentation-fault,Gdb,Segmentation Fault,我有一个程序,它在一个特定的行上进行分段: uint64\u t较小的数量=*(uint64\u t*)(较小的基数+指数) GDB成功捕获segfault,允许我调试问题。但是,如果从GDB提示符运行该行,则不会发生内存访问冲突: (gdb)p较小的基数=*(uint64+t*)(较小的基数+指数) 有人能就如何调试这个问题提供一些建议吗?我不知所措,因为我验证了较小的_base+索引中的内存存在。可能是演员的原因吗 提前谢谢 编辑:提供更多的代码,但实际上就是这么简单。我对代码进行了大量编辑
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++;
}
...
}
uint64\u t**查找差异(无符号字符*较大的基数,
uint64尺寸,
无符号字符*较小的字符基数,
uint64(tmap尺寸)
{
uint64\u t len=尺寸
编辑#2:现在我在想,指针解引用是否可能超出len?据我所知,x86数字是从高位到低位存储的。因此,在存储器中,数字0x01020304存储为0x04 0x03 0x02 0x01。这是正确的吗?如果这不是真的,则遵从性将超出缓冲区的末尾。但是,在GDB中,我验证了地址是可访问的。我不知道如何使用find_difference()函数以及传递给该函数的参数值,但我怀疑您的指针算法是错误的 将大_基和小_基递增1,并将结果地址转换为u64*。
如果大小以字节为单位,那么您应该检查大的\u base+index+8