malloc()中的分段错误?

malloc()中的分段错误?,c,segmentation-fault,malloc,stack-trace,C,Segmentation Fault,Malloc,Stack Trace,我在malloc()例程中遇到了一个分段错误。以下是来自gdb的stacktrace: #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.

我在malloc()例程中遇到了一个分段错误。以下是来自gdb的stacktrace:

#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()中的代码。这是相当标准的,正如您从stacktrace中看到的,它调用了大小为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 %zu\n", size);
            exit(-1);
        }
    }
    return result;
}
和第117行,与.c:

        item->readBuffer = xmalloc(kInitialPacketBufferSize);

您很可能在代码的其他地方看到了错误的影响,即访问分配之外的内存。如果幸运的话,您的代码可以触及malloc用于跟踪分配的一些内部值


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

您最有可能看到代码中其他地方的错误的影响,即访问分配之外的内存。如果幸运的话,您的代码可以触及malloc用于跟踪分配的一些内部值

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

您能检查这行吗

#3  0x0000000000403ab0 in xmalloc (size=1024) at global.c:14
大小为1024的全局.c。 此外,您还可以使用Wegge提到的一些工具来检测重新升级此SEGFULT时出现的一些问题。

您可以检查线路吗

#3  0x0000000000403ab0 in xmalloc (size=1024) at global.c:14
大小为1024的全局.c。
此外,您还可以使用Wegge提到的一些工具来检测重新分级此SEGFULT的某些问题。

至少有三个基本原因

  • 您覆盖了malloc()返回的项,并在其开始之前或结束之后写入了内容

  • 你两次释放了一些东西,这在某种程度上是

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


  • 任何这些操作都会损坏malloc)堆,从而导致其故障。

    至少有三个基本原因

  • 您覆盖了malloc()返回的项,并在其开始之前或结束之后写入了内容

  • 你两次释放了一些东西,这在某种程度上是

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


  • 任何这些操作都会损坏malloc)堆,从而导致其出现故障。

    如果您发布代码,这会有所帮助!请编辑您的问题以包括
    processConnectionQueue
    函数,至少包括117行。您可以发布代码,特别是在调用
    malloc()
    之前?如果您想自己解决它,您可以使用GDB的
    up
    命令进入调用堆栈,并且当您处于位置4时(这是你的函数)你可以检查所有变量,看看它们看起来是否正常。在第117行发布你的代码。如果你发布代码,这会有所帮助!请编辑你的问题,将
    processConnectionQueue
    函数包括在内,至少包括117行左右的内容。你能发布代码吗,特别是在调用
    malloc()之前
    ?如果您想自己解决它,您可以使用GDB的
    up
    命令向上移动调用堆栈,当您处于位置4时(这是您的函数)您可以检查所有变量,看看它们是否正常。将代码张贴在第117行。使用libefence,我发现我的一个指针被设置为0xff。这可能很容易成为malloc状态变量。感谢提示!使用libefence,我发现我的一个指针被设置为0xff。这可能很容易成为malloc状态变量。感谢提示!