2013-05-14 1 views
0

동적으로 할당 된 동적 메모리를 해제하면서 내 프로그램을 성공적으로 실행 한 후 원치 않는 결과를 얻었습니다. 내가 GDB를 사용하여 트랙을 백업 할 때"free() : invalid pointer"오류 및 코어 덤프

*** glibc detected *** /home/ahor/Desktop/Project Work/node: free(): invalid pointer: 0xb7fda000 *** 
======= Backtrace: ========= 
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb7e93ee2] 
/home/ahor/Desktop/Project Work/node[0x8048cf9] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb7e374d3] 
/home/ahor/Desktop/Project Work/node[0x8048561] 
======= Memory map: ======== 
08048000-0804a000 r-xp 00000000 08:06 786473  /home/ahor/Desktop/Project Work/node 
0804a000-0804b000 r--p 00001000 08:06 786473  /home/ahor/Desktop/Project Work/node 
0804b000-0804c000 rw-p 00002000 08:06 786473  /home/ahor/Desktop/Project Work/node 
0804c000-0806d000 rw-p 00000000 00:00 0   [heap] 
b7deb000-b7e07000 r-xp 00000000 08:06 2228253 /lib/i386-linux-gnu/libgcc_s.so.1 
b7e07000-b7e08000 r--p 0001b000 08:06 2228253 /lib/i386-linux-gnu/libgcc_s.so.1 
b7e08000-b7e09000 rw-p 0001c000 08:06 2228253 /lib/i386-linux-gnu/libgcc_s.so.1 
b7e1d000-b7e1e000 rw-p 00000000 00:00 0 
b7e1e000-b7fc1000 r-xp 00000000 08:06 2228351 /lib/i386-linux-gnu/libc-2.15.so 
b7fc1000-b7fc3000 r--p 001a3000 08:06 2228351 /lib/i386-linux-gnu/libc-2.15.so 
b7fc3000-b7fc4000 rw-p 001a5000 08:06 2228351 /lib/i386-linux-gnu/libc-2.15.so 
b7fc4000-b7fc7000 rw-p 00000000 00:00 0 
b7fd7000-b7fd8000 rw-p 00000000 00:00 0 
b7fd8000-b7fd9000 rw-s 00000000 00:04 12517386 /SYSV001120bd (deleted) 
b7fd9000-b7fda000 rw-p 00000000 00:00 0 
b7fda000-b7fdb000 rw-s 00000000 00:04 12484617 /SYSV00307eff (deleted) 
b7fdb000-b7fdd000 rw-p 00000000 00:00 0 
b7fdd000-b7fde000 r-xp 00000000 00:00 0   [vdso] 
b7fde000-b7ffe000 r-xp 00000000 08:06 2228363 /lib/i386-linux-gnu/ld-2.15.so 
b7ffe000-b7fff000 r--p 0001f000 08:06 2228363 /lib/i386-linux-gnu/ld-2.15.so 
b7fff000-b8000000 rw-p 00020000 08:06 2228363 /lib/i386-linux-gnu/ld-2.15.so 
bffdf000-c0000000 rw-p 00000000 00:00 0   [stack] 

...... 
...... 
...... 

나는이 메시지를받을.

Program received signal SIGABRT, Aborted. 
0xb7fdd424 in __kernel_vsyscall() 
(gdb) bt 
#0 0xb7fdd424 in __kernel_vsyscall() 
#1 0xb7e4c1df in raise() from /lib/i386-linux-gnu/libc.so.6 
#2 0xb7e4f825 in abort() from /lib/i386-linux-gnu/libc.so.6 
#3 0xb7e8939a in ??() from /lib/i386-linux-gnu/libc.so.6 
#4 0xb7e93ee2 in ??() from /lib/i386-linux-gnu/libc.so.6 
#5 0x08048cf9 in main (argc=6, argv=0xbffff214) at node.c:180 

...... ...... 다음은이 영향을 미치고 내 코드 세그먼트입니까? 그 원인을 발견 할 수 없어요. 당신이 저를 도울 수 있다면 정말 고맙겠습니다.

// creating the dynamic memory for net 
    if((net = (struct dot **)malloc(v * sizeof(struct dot))) == NULL) { 
     perror("struct dot malloc() failed\n"); 
     exit(1); 
    } 
    for(i = 0 ; i < v; i++) 
     if((net[i] = (struct dot *)malloc(v * sizeof(struct dot))) == NULL) { 
     perror("net[i] malloc() failed.\n"); 
     for(j = 0; j < i; j++) 
      free(net[j]); 
     free(net);  
     } 
..... 
..... 
// creating the dynamic memory for link_status 
    if((link_status = (struct link **)malloc(v * sizeof(struct link))) == NULL) { 
     perror("struct link malloc() failed\n"); 
     exit(1); 
    } 
    for(i = 0 ; i < v; i++) 
     if((link_status[i] = (struct link *)malloc(v * sizeof(struct link))) == NULL) { 
     perror("link_status[i] malloc() failed.\n"); 
     for(j = 0; j < i; j++) 
      free(link_status[j]); 
     free(link_status);  
     } 
...... 

검출 된 glibc는 아래에서 사용되는 free() 함수에서 가져온 것입니다.

// free the allocated dynamic memories 
    for(i = 0; i < v; i++) { 
     free(net[i]); 
     free(link_status[i]); 
    } 
    free(net); 
    free(link_status); 

도와주세요!

답변

1

당신에게 속하지 않은 일부 메모리를 덮어 쓰는 중입니다. valgrind를 사용하여 나쁜 쓰기를 담당하는 코드를 찾을 수 있습니다.

+0

내게 속하지 않는 기억을 쓰는 것은 무엇을 의미합니까? 그 문제를 일으키는 무료() 기능 thats, 나는 문제가 쓰기보다는 오히려 자유 이상의 이상이라고 생각합니다. 또한 Valgrind를 사용하는 방법을 알지 못합니다. 어쨌든 gdb로 할 수 있습니까? –

+0

메모리 덩어리를 요청하면 libc는 어떻게 든 추가 정보, 즉 그 청크의 크기 (사용자가 얻는 포인터로 식별 됨)를 추적해야합니다. 이것은 특정 음수 오프셋에서 수행 할 수 있습니다. 예를 들어, foo = malloc (크기)를 수행하고 foo-x libc에는 무료로 사용되는 개인 정보가 있습니다. 버그를 통해 foo-x에서 해당 정보를 덮어 쓰면 잘못된 정보로 인해 피드가 문제가 될 수 있습니다. – timos

+0

오류가 그러한 성격의 경우 valgind로 디버깅하는 것이 gdb보다 훨씬 쉽습니다. 왜냐하면 다른 용도로 사용되기 때문입니다. valgrind ./your_program your_args와 같은 프로그램을 실행하고 valgrinds 출력에주의하십시오. – timos