2014-02-11 1 views
0

CSV 파일을 읽고 첫 번째 항목과 두 번째 항목을 가져 오는 while 루프가 있으며이를 C로 구현 된 해시 테이블에 추가합니다. 약 40 개 항목이있는 작은 파일로 테스트했습니다 , 그리고 그것은 잘 작동하지만, 그 이상의 어떤 파일을 전달하려고하면, 부분은 무한 루프가 발생합니다.lowlevellock 및 무한 While 루프

, 가산를 처리하는 코드는 다음과 같습니다

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와 단계별 때 feof에 대한

#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' _은 기본 POSIX 스레드 라이브러리입니다. 그래서 여러분의 코드는 깊은 중첩 된 라이브러리에서 데드 록킹됩니다. 가능하다면 gdb 명령'where' 또는'backtrace'를 사용하여 전체 스택 추적을 보여줍니다. – rodrigo

+0

'# 0 __lll_lock_wait_private()에서 ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:97 _L_lock_28 # 1 0x00007ffff763f518()에서 /lib/x96_64-linux-gnu/libc.so 0.6 2 feof.c에서 _IO_feof (FP = 0x60c070)에 0x00007ffff763f4b1 37 # populateTable (표 = 0x604250, 0x40310b NAME = "데이터/census.csv") 3 0x0000000000402e78 Table.c에서 193 # 4 server.c의 main (argc = 2, argv = 0x7fffffffeae8)의 0x00000000004016aa : 189' – anarian

+1

자, 이제'feof()'호출에 교착 상태가 발생합니다. 그리고 당신의'file'은 어디에서나 공유되지 않기 때문에, 이것의 가장 큰 원인은 메모리 손상입니다. 즉, 아마도 여러분의'addEntry()'어딘가에서 스택 메모리가 손상 될 수 있습니다. 아마도 로컬 버퍼 오버 플로우 나 비슷한 이유로 인해 ... – rodrigo

답변

1

코드 읽기 말한다 :

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 버퍼)이있을 가능성이 큽니다. Valgrind은 버그를 바로 잡을 것 같습니다.

+0

아, 그래, 내가 malloc 오류가 있어요. 구조체 내부에 구조체 배열을 할당하려고했지만 실수로 * numberof (struct) 번호를 할당하는 대신 포인터의 각 요소를 할당하려고했습니다. 고마워! – anarian