我很茫然。以下是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
,它看起来很好吗?它怎么可能是一个无效的指针,但仍然包含字符就好了?
我该如何调试这个段错误?
答案 0 :(得分:3)
取消引用无效指针会调用未定义的行为,这意味着可能发生任何事情,包括您正在观察的行为。如果我不得不猜测,我会说:
malloc
获得的,或者你已经free
d了,或者你已经意外修改了它。malloc
的幕后元数据。我建议在像Valgrind这样的应用程序中运行你的应用程序,它旨在帮助追踪内存问题。
答案 1 :(得分:1)
有几种可能性:
在您的情况下,在上面的选项(1,2)和3之间进行选择很简单:您可以直观地检查“cs-> body”指针如何获得其值。如果确实是通过malloc et.al获得的,那么只有选项3是开放的。在不使用valgrind的情况下,找到虚假覆盖的唯一方法是(暂时)回滚源中的最新更改。