2013-11-27 5 views
3

이 벨로우즈 코드는 마지막 줄에서 중단됨 (코어 덤프 됨)을 생성합니다.중단됨 (코어 덤프 됨)에 대한 추가 정보가 필요합니다.

코드 :

#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

디버깅 기호 (GCC의 경우 -ggdb)로 컴파일하면 오류가 발생한 행을 볼 수 있습니다. 엄밀히 말하면,이 코어 덤프는 컴파일러/실행 플랫폼이 이미'자유로운 '포인터가'자유로운'것이 정의되지 않은 행동이기 때문에 느낄 때마다 발생합니다. – Kninnug

+0

공유 라이브러리 및 해당 사용 권한을 표시하는 이유는 무엇입니까? – SGG

+0

'free'는 (프로그램이 자동으로 링크되는)'libc'에 있기 때문에 코어 덤프가 발생합니다. 좀 더 복잡한 버그에서이 정보는 프로그램이 한 소스 파일의 한 줄에서 충돌 할 수 있지만 실제 버그는 링크 된 라이브러리에있을 수 있기 때문에 문제가 정확히 어디에서 발생했는지 추적하는 데 유용합니다. – Kninnug

답변

5

일반적으로 프로그램이 비정상적으로 종료되면 코어 덤프 파일이 생성됩니다. free()을 포인터에 두 번 호출하면 세그먼트 화 오류가 발생합니다. 그것이 당신이 코레도프를 얻는 이유입니다. here에 동일한 포인터를 두 번 무료로 호출하는 것에 대한 정보를 찾을 수 있습니다.

+0

'free'를 1 회 이상 호출하면'코어 덤프 '가 발생합니다. 나는 동의한다. 같은 문제가 올 수있는 다른 경우가 있습니까? – SGG