2014-02-11 61 views
0

我有一個while循環,通過讀取一個CSV文件,獲取第一個和第二個條目,並將其添加到C中實現的散列表。我已經測試了與約40條目的小文件,並且它工作正常,但是當我嘗試傳入大於此的任何文件時,WHILE部分會導致無限循環。lowlevellock和無限雖然循環

處理該添加的代碼如下所示:

void populateTable(Table *table, char *name) { 
    FILE *file = fopen(name, "r"); 
    if(file != NULL) { 
     while(!feof(file)) { 
      char line[128]; 
      fgets(line, sizeof line, file); 
      char key[64]; 
      int value; 
      sscanf(line, "%[^','],%d", key, &value); 
      addEntry(table, key, value); 
     } 
    } 
    fclose(file); 
    return; 
} 

我用GDB調試程序審理。當我有42個條目時,所有條目都可以正確輸入,並且可以正確打印和訪問它們。當有更多的時候,代碼變得沒有反應。當我用GDB逐步完成,它說

#0 __lll_lock_wait_private() at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:97 
#1 0x00007ffff763f518 in _L_lock_28() from /lib/x96_64-linux-gnu/libc.so.6 
#2 0x00007ffff763f4b1 in _IO_feof (fp=0x60c070) at feof.c:37 
#3 0x0000000000402e78 in populateTable (table=0x604250, name=0x40310b "data/census.csv") at Table.c:193 
#4 0x00000000004016aa in main (argc=2, argv=0x7fffffffeae8) at server.c:189 
+0

'nptl' _is原生POSIX線程Library_。所以你的代碼在一些深層嵌套庫中是死鎖的。嘗試使用gdb命令'where'或'backtrace'顯示完整的堆棧跟蹤(如果可用)。 – rodrigo

+0

'#0 __lll_lock_wait_private() at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:97 #1 0x00007ffff763f518 in _L_lock_28()from /lib/x96_64-linux-gnu/libc.so 0.6 #2 0x00007ffff763f4b1在_IO_feof(FP = 0x60c070)在feof.c:37 #3 0x0000000000402e78在populateTable(表= 0x604250, 名稱= 0x40310b 「數據/ census.csv」)在Table.c:193 # 4在主服務器上的main(argc = 2,argv = 0x7fffffffeae8)0x00000000004016aa server:189' – anarian

+1

好的,所以你在調用'feof()'時遇到了一個死鎖。由於你的'文件'不能在任何地方共享,最可能的原因是內存損壞。也就是說,你的'addEntry()'在某處損壞了堆棧的內存,可能是因爲某些本地緩衝區溢出或類似的... – rodrigo

回答

1

代碼爲feof寫着:

int _IO_feof (_IO_FILE *fp) 
{ 
    int result; 
    CHECK_FILE (fp, EOF); 
    _IO_flockfile (fp); 
    result = _IO_feof_unlocked (fp); 
    _IO_funlockfile (fp); 
    return result; 
} 

你僵持在_IO_flockfile線。

我可以想到發生這種情況的唯一方法是如果文件本身已損壞。

很可能您的程序中的其他地方出現堆損壞(溢出malloc ed緩衝區),這會觸發此操作。 Valgrind很可能會直接指向你的錯誤。

+0

啊,是的,我確實有一個malloc錯誤。我試圖在結構中分配一個結構數組,但錯誤地嘗試在指針中分配每個單獨的元素,而不是分配數字* sizeof(struct)。它現在有用,謝謝! – anarian