2013-04-22 3 views
0

내가 관련 세부 사항 아래에있는 C 프로그램 작성 중 :덤프이 핵심이 생성됩니다 왜

void calculate(struct iso_matrix *iso_matrix) { 
     struct graphlet *graphlet = init_graphlet(GL_SIZE); 
     int *index_map = (int *)malloc(iso_matrix->n_rw_col); 
     //some other stuff. Working fine. 
     free(index_map); //line 90(for future references) 
} 

내가 터미널에서 얻을 출력 :

*** glibc detected *** ./bin/exec: free(): invalid next size (fast):0x00000000023696f0 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x2b3b5fc92b96] 
./bin/exec[0x403ff9] 
./bin/exec[0x4049eb] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x2b3b5fc3576d] 
./bin/exec[0x400889] 
======= Memory map: ======== 
(not shown here) 

그리고 GDB 역 추적입니다 :

#0 0x00007ffff7a51425 in raise() from /lib/x86_64-linux-gnu/libc.so.6 
#1 0x00007ffff7a54b8b in abort() from /lib/x86_64-linux-gnu/libc.so.6 
#2 0x00007ffff7a8f39e in ??() from /lib/x86_64-linux-gnu/libc.so.6 
#3 0x00007ffff7a99b96 in ??() from /lib/x86_64-linux-gnu/libc.so.6 
#4 0x0000000000403ff9 in calculate (iso_matrix=0x6084a0) at src/graphlet_iso_mat.c:90 
#5 0x00000000004049eb in main (argc=3, argv=0x7fffffffdef8) at src/main.c:70 

왜 이런 일이 발생했는지 또는 디버깅하는 방법을 이해할 수 없습니다. 어떤 도움을 주셔서 감사합니다.

[편집] 전체 calculate 기능 :

void calculate(struct iso_matrix *iso_matrix) 
{ 
    printf("Calculate called\n"); 
    struct graphlet *graphlet = init_graphlet(GL_SIZE); 
    int *index_map = (int *)malloc(iso_matrix->n_rw_col); 
    struct graph *graph = init_graph(0, GL_SIZE); /*Small graph so prefered matrix representation.*/ 

    /*Initialize the list_head.*/ 
    if(!iso_matrix->unique) 
     iso_matrix->unique = init_listhead(); 

    for(int i=0; i<iso_matrix->n_rw_col; ++i) 
    { 
     graphlet_to_graph(graphlet, graph); 
     calc_heuristic(graph, 3); 

     /*check_unique() compares only between same type of graphs.*/ 
     index_map[i] = check_unique(iso_matrix->unique, graph); 
     if(index_map[i]==-1) 
     { 
      struct graph *cpy=init_graph(0, GL_SIZE); 
      cpy_graph(graph, cpy); 
      int *graphlet_no = (int *)malloc(sizeof(int)); 
      *graphlet_no = i; 
      struct container *container = (struct container *)malloc(sizeof(struct container)); 
      container->data = (void *)cpy; 
      container->id = (void *)graphlet_no; 
      struct list_node *list_node = init_listnode((void *)container); 
      add_to_list(list_node, iso_matrix->unique); 
     } 
     else 
     { 
      *(*((iso_matrix->iso_mat)+index_map[i])+i) = 1; 
     } 

     inc_graphlet(graphlet); 
     reset_graph(graph); 
    } 

    for(int i=0; i<iso_matrix->n_rw_col; ++i) 
    { 
     if(index_map[i]==-1) /*If same then continue.*/ 
      continue; 
     for(int j=0; j<iso_matrix->n_rw_col; ++j) 
      *(*((iso_matrix->iso_mat)+i)+j) = *(*((iso_matrix->iso_mat)+index_map[i])+j); 
    } 

    /*Destroying allocated memory.*/ 
    free(index_map); 
} 
+2

free()가 malloc()에서 온 것처럼 보이지 않는 포인터를 가지고 있다는 것을 알려줍니다. 아마도 "// 다른 것들"섹션의 일부는 포인터를 사용하거나 메모리를 덮어 쓰지 말아야합니다. 코드가 작동하기 때문에 그것이 옳다는 것을 의미하지는 않습니다. :-) –

+0

이것은 아마 어딘가에 버퍼 오버런 일 것입니다. 메모리 할당 및 할당 해제는 일반적으로 힙 구조의 손상을 감지하고 경고 및 어설 션을 발행합니다. 가능하다면'free' 전에 디버거를 중단하고'index_map' 주변의 메모리를 살펴보십시오. 아마 당신은 아마도'index_map'을 위해 할당 된 메모리 앞 공간에 동적으로 할당 된 버퍼를 덮어 쓰고있을 것입니다. –

+0

코드를 검사했는데, 내가 겹쳐 쓰는 것처럼 보이지 않습니다. 이 디버깅 형식을 읽을 수있는 곳에서 GDB를 사용하여 포인터를 제공 할 수 있습니까? 나는 GDB에 처음 온 사람이다. 또한 편집 된 질문을 참조하십시오. –

답변

1

나는이 것을 도박 해요 :

int *index_map = (int *)malloc(iso_matrix->n_rw_col); 

iso_matrix->n_rw_col정수의 할당을 가리하기위한 것입니다. 바이트 계산에서 정수의 크기를 잊어 버렸습니다.

다른 문제가있을 수 있지만 분명히 큰 문제입니다. 참고 : 나는 또한 C 코드에서하지 말아야 할 malloc()의 캐스트를 제거했습니다. stdlib.h이이 소스 파일의 상단에있는 #include 목록에 포함되어 있는지 확인하십시오.

+0

내 바보 같아. "가능성이있는 다른 문제"에 대해 말해 줄 수 있습니까 –

+0

@AmanDeepGautam 코드에 뛰어 들지 않아도됩니다. 필자는 철저하게 해부되지 않은 코드를 결코 믿지 않으며, 절대 후회하지 않는 함수 호출이 많습니다. 그러나 이것은 꽤 분명했습니다. ** valgrind ** 아래에서 실행하여 약간 높은 자신감을 얻으십시오. – WhozCraig

+0

@WhoCraig 좋습니다. 다른 아주 명백한 문제가 있다고 생각했습니다. 고맙습니다. –