Нужна дополнительная информация о Aborted (дамп ядра)

Этот приведенный ниже код будет генерировать 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)

Вот мне интересно узнать, в каких случаях будут происходить эти дампы ядра?

Можем ли мы узнать, на какой строке это произошло, не используя отладчик?

какую информацию он показывает (об общих библиотеках)?


person gangadhars    schedule 27.11.2013    source источник
comment
Если вы компилируете с отладочными символами (-ggdb для GCC), вы можете увидеть строки, в которых возникают ошибки. Строго говоря, эти дампы ядра будут происходить всякий раз, когда компилятор/рабочая платформа чувствует, что freeing указатель, который уже был freed, является неопределенным поведением.   -  person Kninnug    schedule 27.11.2013
comment
почему он показывает общие библиотеки и их разрешения?   -  person gangadhars    schedule 27.11.2013
comment
Потому что free находится в libc (с которым ваша программа автоматически связана), и именно здесь происходит сброс ядра. В более сложных ошибках эта информация полезна для отслеживания того, где именно возникает проблема, поскольку программа может дать сбой на одной строке в одном исходном файле, но фактическая ошибка может быть в связанной библиотеке.   -  person Kninnug    schedule 27.11.2013


Ответы (1)


Файл дампа ядра обычно создается, когда программа аварийно завершает работу. Двойной вызов free() для указателя вызывает ошибку сегментации. Вот почему вы получаете coredump. Вы можете найти некоторую информацию здесь о вызове free по одному и тому же указателю дважды.

person Chinna    schedule 27.11.2013
comment
вызов free более 1 раза приведет к core dumped. Я согласен. Есть ли другой случай, когда такая же проблема возникнет? - person gangadhars; 27.11.2013