0

我有一个在特定行出现段错误的程序:

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 中,我验证了该地址是可访问的。

4

2 回答 2

1

我不知道你如何使用 find_difference() 函数以及传递给函数的参数值是什么,但我怀疑你的指针算法是错误的。

您将 large_base 和 small_base 加 1 并将结果地址转换为 u64*。如果 size 以字节为单位,那么您应该检查 large_base+index+8 < size。

于 2013-04-25T19:09:12.983 回答
0

您的原始指针算法在将(unsigned char *)转换为uint64_t之前将索引添加到导致未对齐的内存负载,即尝试从不是 8 的倍数的地址中取消引用(uint64_t *) 。这在调试器中有效,但在您的程序中导致 SEGFAULT。

于 2013-04-28T21:03:33.963 回答