如何在realloc()上调试segfault?

时间:2011-11-14 16:12:33

标签: c gdb realloc

我很茫然。以下是gdb中发生的事情:

571             void *aux = realloc(cs->body, new_size);
(gdb) p cs->body
$6 = 0x627b20 "POST /upload HTTP/1.1\r\nUser-Agent: curl/7.22.0 (x86_64-unknown-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.0e zlib/1.2.5 c-ares/1.7.5 libidn/1.22 libssh2/1.2.9\r\nHost: localhost:2001\r\nAccept: */*\r\nContent-Le"...
(gdb) n
*** glibc detected *** /home/pc/bin/main: realloc(): invalid pointer: 0x0000000000627b20 ***

...在回溯和内存映射(我不知道如何解释)之后远远落后:

Program received signal SIGABRT, Aborted.
0x00007ffff7660d95 in raise () from /lib64/libc.so.6

这怎么可能?我在realloc调用之前打印了cs->body,它看起来很好吗?它怎么可能是一个无效的指针,但仍然包含字符就好了? 我该如何调试这个段错误?

2 个答案:

答案 0 :(得分:3)

取消引用无效指针会调用未定义的行为,这意味着可能发生任何事情,包括您正在观察的行为。如果我不得不猜测,我会说:

  • 你的指针确实无效(它不是从malloc获得的,或者你已经free d了,或者你已经意外修改了它。
  • 你在某个地方溢出了一个缓冲区,并删除了malloc的幕后元数据。

我建议在像Valgrind这样的应用程序中运行你的应用程序,它旨在帮助追踪内存问题。

答案 1 :(得分:1)

有几种可能性:

  • 内存有效,但无法通过malloc或realloc获取(字符串文字,全局,静态,自动内存,通过mmap()或shm *获取的内存)
  • 内存是通过malloc获得的,但指针不是指向对象开头的确切指针(你从malloc获得的那个)你可能跳过了初始白色,或者你的指针指向一个结构或2d阵列等。
  • 您在程序中的任何位置使用错误的偏移量或指针损坏了您的记忆

在您的情况下,在上面的选项(1,2)和3之间进行选择很简单:您可以直观地检查“cs-> body”指针如何获得其值。如果确实是通过malloc et.al获得的,那么只有选项3是开放的。在不使用valgrind的情况下,找到虚假覆盖的唯一方法是(暂时)回滚源中的最新更改。