C语言 malloc() 中的隔离错误



我在 malloc() 例程中遇到了分割错误。以下是来自 gdb 的堆栈跟踪:

#0  0x00007ffff787e882 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff787fec6 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00007ffff7882a45 in malloc () from /lib/x86_64-linux-gnu/libc.so.6
#3  0x0000000000403ab0 in xmalloc (size=1024) at global.c:14
#4  0x00000000004020fb in processConnectionQueue (arguments=0x60a4e0)
    at connection.c:117
#5  0x00007ffff7bc4e9a in start_thread ()
   from /lib/x86_64-linux-gnu/libpthread.so.0
#6  0x00007ffff78f24bd in clone () from /lib/x86_64-linux-gnu/libc.so.6
#7  0x0000000000000000 in ?? ()

这是怎么回事?什么可能导致 malloc() 出现段错误?

编辑:这是来自xmalloc()的代码。这是非常标准的,正如你从堆栈跟踪中看到的那样,它调用的大小为 1024 的 malloc。

void* xmalloc(size_t size)
{
    void* result = malloc(size);
    if(!result)
    {
        if(!size)
        {
            result = malloc(1);
        }
        if(!result)
        {
            fprintf(stderr, "Error allocating memory of size %zun", size);
            exit(-1);
        }
    }
    return result;
}

和 connection.c 中的第 117 行:

        item->readBuffer = xmalloc(kInitialPacketBufferSize);

您很可能在代码中的其他位置看到错误的影响,该错误访问分配之外的内存。如果你足够幸运,你的代码可以触及 malloc 用来跟踪分配的一些内部值。

如果有可能,请尝试将您的代码与分配检查器(如 libefence 或类似)链接,并使用它来定位真正的问题。

你能检查一下这条线吗

#3  0x0000000000403ab0 in xmalloc (size=1024) at global.c:14

大小 = 1024 的全局 .c。您还可以使用 Wegge 提到的一些工具来检测重新分级此段错误的一些问题。

这至少有三个基本原因。

  1. 你覆盖了 malloc() 返回的项目,并在其开头或结尾之前或之后写了一些东西。

  2. 你释放了两次东西,这在某种程度上是一个特例

  3. 您释放了一些不是 malloc() 结果的内容。

这些操作中的任何一个都会损坏 malloc))堆,这会导致它出现故障。

相关内容

  • 没有找到相关文章

最新更新