下面的代码将在最后一行生成Aborted(核心转储)。
代码:
#include <stdio.h>
#include <malloc.h>
int main()
{
char *ptr;
ptr=malloc(sizeof(char)*10);
free(ptr);
free(ptr); // core dumped
}
输出为:
*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x091f7008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb7665ee2]
./a.out[0x804846d]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb76094d3]
./a.out[0x8048371]
======= Memory map: ========
08048000-08049000 r-xp 00000000 fc:00 4070236 /home/gangadhar/a.out
08049000-0804a000 r--p 00000000 fc:00 4070236 /home/gangadhar/a.out
0804a000-0804b000 rw-p 00001000 fc:00 4070236 /home/gangadhar/a.out
091f7000-09218000 rw-p 00000000 00:00 0 [heap]
b75ba000-b75d6000 r-xp 00000000 fc:00 22938319 /lib/i386-linux-gnu/libgcc_s.so.1
b75d6000-b75d7000 r--p 0001b000 fc:00 22938319 /lib/i386-linux-gnu/libgcc_s.so.1
b75d7000-b75d8000 rw-p 0001c000 fc:00 22938319 /lib/i386-linux-gnu/libgcc_s.so.1
b75ef000-b75f0000 rw-p 00000000 00:00 0
b75f0000-b7794000 r-xp 00000000 fc:00 22937623 /lib/i386-linux-gnu/libc-2.15.so
b7794000-b7795000 ---p 001a4000 fc:00 22937623 /lib/i386-linux-gnu/libc-2.15.so
b7795000-b7797000 r--p 001a4000 fc:00 22937623 /lib/i386-linux-gnu/libc-2.15.so
b7797000-b7798000 rw-p 001a6000 fc:00 22937623 /lib/i386-linux-gnu/libc-2.15.so
b7798000-b779b000 rw-p 00000000 00:00 0
b77b1000-b77b4000 rw-p 00000000 00:00 0
b77b4000-b77b5000 r-xp 00000000 00:00 0 [vdso]
b77b5000-b77d5000 r-xp 00000000 fc:00 22937715 /lib/i386-linux-gnu/ld-2.15.so
b77d5000-b77d6000 r--p 0001f000 fc:00 22937715 /lib/i386-linux-gnu/ld-2.15.so
b77d6000-b77d7000 rw-p 00020000 fc:00 22937715 /lib/i386-linux-gnu/ld-2.15.so
bf7e0000-bf801000 rw-p 00000000 00:00 0 [stack]
Aborted (core dumped)
在这里,我很想知道在哪些情况下会发生这些堆芯倾倒?
在不使用调试器的情况下,我们能找出这是在哪一行发生的吗?
它显示了什么信息(关于共享库)?
核心转储文件通常在程序异常终止时创建。在指针上调用free()
两次会导致分段错误。这就是为什么你被核心抛弃的原因。你们可以在这里找到一些关于在同一指针上调用free两次的信息。
由于您提出这个问题已经很多年了,我只是添加这个答案,以防其他用户觉得这有帮助。
正如@Chinna在他的回答中所说,核心转储文件是在Linux中程序崩溃或异常终止时创建的(在Windows中也称为崩溃转储),它包含崩溃时的程序状态,即内存、寄存器值、调用堆栈等。未经处理的异常、非法内存访问,和溢出程序堆栈是一些常见的情况,这些情况会导致分段错误或中止消息并创建核心转储文件。
通常,您需要一个调试器来获取调用回溯并检查崩溃发生的位置。但是,如果您不想或不能使用调试器,程序中嵌入的良好日志记录系统可以通过稍后查看日志来帮助您确定崩溃的位置。