【问题标题】:Segmenation fault in malloc()?malloc()中的分段错误?
【发布时间】:2012-10-12 09:31:41
【问题描述】:

我在 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 %zu\n", size);
            exit(-1);
        }
    }
    return result;
}

connection.c 中的第 117 行:

        item->readBuffer = xmalloc(kInitialPacketBufferSize);

【问题讨论】:

  • 如果您发布代码会有所帮助!
  • 请编辑您的问题以包含 processConnectionQueue 函数,至少在 117 左右的行。
  • 您能否发布代码,尤其是在致电malloc() 之前?
  • 如果你想自己解决,你可以使用GDB的up命令向上调用堆栈,当你在位置4时(这是你的函数)你可以检查所有变量,看看它们看起来没问题。
  • 在第 117 行发布您的代码。

标签: c segmentation-fault malloc stack-trace


【解决方案1】:

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

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

【讨论】:

  • 使用 libefence,我发现我的一个指针设置为 0xff。这很容易成为 malloc 状态变量。感谢您的提示!
【解决方案2】:

你能查一下这条线吗

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

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

【讨论】:

    【解决方案3】:

    至少有三个基本原因。

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

    2. 你释放了两次,这在某种程度上是

    3. 的特例
    4. 你释放了不是 malloc() 结果的东西。

    任何这些操作都会破坏 malloc)) 堆,从而导致它发生故障。

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 2014-03-29
      • 2015-01-29
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多