发生SEGFULT时,GDB断开线路,但SEGFULT后运行的线路未显示违规

发生SEGFULT时,GDB断开线路,但SEGFULT后运行的线路未显示违规,gdb,segmentation-fault,Gdb,Segmentation Fault,我有一个程序,它在一个特定的行上进行分段: uint64\u t较小的数量=*(uint64\u t*)(较小的基数+指数) GDB成功捕获segfault,允许我调试问题。但是,如果从GDB提示符运行该行,则不会发生内存访问冲突: (gdb)p较小的基数=*(uint64+t*)(较小的基数+指数) 有人能就如何调试这个问题提供一些建议吗?我不知所措,因为我验证了较小的_base+索引中的内存存在。可能是演员的原因吗 提前谢谢 编辑:提供更多的代码,但实际上就是这么简单。我对代码进行了大量编辑

我有一个程序,它在一个特定的行上进行分段:

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您的原始指针算法将索引添加到(无符号字符*)中,然后将其强制转换为uint64\u t,从而导致未对齐的内存负载,即尝试取消引用(uint64\u t*)来自不是8的倍数的地址。这在调试器中起作用,但会导致程序中出现SEGFULT。

上下文中的更多代码将对我们有所帮助。请详细说明更小的基和索引类型。size是缓冲区的大小(以字节为单位)。我认为你的评论与我第二次编辑的问题相似,是正确的。对于index=size-1,索引将使用超过缓冲区结尾的8个字节。我去核实一下,然后回来。呸,这太简单了,谢谢你的眼睛。如果我的指针数学搞砸了,我会检查右边的边界。