2013-11-27 6 views
3

Этот код будет генерировать Aborted (core dumped) в последней строке.Нужна дополнительная информация о Aborted (core dumped)

код:

#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) 

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

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

какая информация отображается (об общих библиотеках)?

+0

Если вы компилируете с помощью отладочных символов ('-ggdb' для GCC), вы можете увидеть строки, на которых происходят ошибки. Строго говоря, эти базовые дампы будут возникать всякий раз, когда возникает компилятор/рабочая платформа, поскольку «свободный» указатель, который уже был «свободным», является неопределенным поведением. – Kninnug

+0

Почему он показывает общие библиотеки и их разрешения? – SGG

+0

Потому что 'free' находится в' libc' (с которым ваша программа автоматически связана), и именно там происходит сброс ядра. В более сложных ошибках эта информация полезна для отслеживания, где именно возникает проблема, так как программа может разбиться по одной строке в одном исходном файле, но фактическая ошибка может быть в связанной библиотеке. – Kninnug

ответ

5

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

+0

, вызывающий 'free' более 1 раза, приведет' core dumped'. Согласен. Есть ли другой случай, когда проблема будет такой же? – SGG

Смежные вопросы