我在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()的代码。这是非常标准的,正如您从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;
}
连接c中的第117行:
item->readBuffer = xmalloc(kInitialPacketBufferSize);
答案 0 :(得分:6)
您很可能会在代码中的其他位置看到错误的影响,即在分配之外访问内存。如果您足够幸运,您的代码可以触及malloc用于跟踪分配的一些内部值。
如果您有可能,请尝试将您的代码与libefence或类似的分配检查器相关联,并使用它来查找真正的问题。
答案 1 :(得分:0)
你能检查一下
#3 0x0000000000403ab0 in xmalloc (size=1024) at global.c:14
global.c,大小= 1024。 并且你也可以使用一些工具作为 Wegge 来检测一些重新划分这个段错误的问题。
答案 2 :(得分:0)
至少有三个基本原因。
你超过了malloc()返回的项目,并在开始之前或之后写了一些东西。
你释放了两次,这在某种程度上是
你释放了一些不是malloc()结果的东西。
任何这些操作都会破坏malloc))堆,导致它出现故障。