2013-04-22 35 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()。可能有些東西在「//一些其他的東西」部分是用指針或覆蓋它不應該覆蓋的內存。僅僅因爲代碼有效,這並不意味着它是正確的。 :-) – 2013-04-22 00:25:00

+0

這可能是一個緩衝區溢出的地方。內存分配和釋放通常檢測堆結構中的損壞併發出警告和斷言。如果可能的話,在'free'之前在調試器中斷開並查看'index_map'周圍的內存。您可能會覆蓋分配給「index_map」的內存之前的空間中動態分配的緩衝區。 – 2013-04-22 00:20:03

+0

我檢查了代碼,它看起來不像我覆蓋的東西。你能指出我可以從哪裏讀取這種形式的調試是使用GDB完成的。我也是GDB新手。另請參閱編輯的問題。 – 2013-04-22 00:32:52

回答

1

我下注,這個:

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

是爲了指向的iso_matrix->n_rw_col整數的分配。您在字節計算中忘記了整數的大小:

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

可能還有其他問題,但這顯然是一個大問題。注意:我也刪除了malloc()上的演員,你不應該用C代碼。確保stdlib.h包含在此源文件頂部的#include列表中。

+0

我這麼傻。你能告訴我關於「可能的其他問題」 – 2013-04-22 00:49:18

+0

@AmanDeepGautam不是沒有潛入代碼。我從來不信任我沒有徹底解析的代碼,而且你有大量的函數調用誰是後端,我永遠不會明智的。但是這個很明顯。在** valgrind **下運行它以獲得更高的信心。 – WhozCraig 2013-04-22 00:51:09

+0

@WhoCraig好的。我認爲還有其他非常明顯的問題。謝謝。 – 2013-04-22 00:53:07

相關問題