lowlevellock和无限While循环

lowlevellock和无限While循环,c,while-loop,gdb,C,While Loop,Gdb,我有一个while循环,它读取一个CSV文件,获取第一个和第二个条目,并将其添加到一个用C实现的哈希表中。我用大约40个条目的小文件对它进行了测试,效果很好,但当我尝试传入任何大于该值的文件时,while部分会导致无限循环 处理添加的代码如下所示: void populateTable(Table *table, char *name) { FILE *file = fopen(name, "r"); if(file != NULL) { while(!feof(

我有一个while循环,它读取一个CSV文件,获取第一个和第二个条目,并将其添加到一个用C实现的哈希表中。我用大约40个条目的小文件对它进行了测试,效果很好,但当我尝试传入任何大于该值的文件时,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时,它说

#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

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;
}
您在
\u IO\u文件
行上处于死锁状态

我能想到的唯一方法是,如果文件本身已损坏,就会发生这种情况


很可能在程序的其他地方发生了堆损坏(malloc缓冲区溢出),这会触发此问题。很可能会直接指向您的bug。

nptl
是本机POSIX线程库。因此,您的代码死锁在某个深嵌套库中。如果可用,请尝试使用gdb命令
where
backtrace
\0\uull\u lock\u wait\u private()在../nptl/sysdeps/unix/sysv/linux/x86\u 64/lovellock.S:97#1 0x00007ff763f518 in(从/lib/x96\u 64-linux-gnu/libc.so.6#0x0000x7ff761in)f40; f407u=0xf70f)中的在服务器上的feof.c:37#3 0x0000000000402e78 in populateTable(table=0x604250,name=0x40310b“data/census.csv”)在table.c:193#4 0x00000000004016aa in main(argc=2,argv=0x7fffffffeae8)中。c:189
确定,因此您对
feof()的调用出现死锁。由于您的
文件
没有在任何地方共享,最有可能的原因是内存损坏。也就是说,您的
addEntry()
在某个地方损坏了堆栈内存,可能是由于某些本地缓冲区溢出或类似原因……顺便说一句,您对
fclose()
的调用应该在
if
中,因为调用
fclose(NULL)
是未定义的。可能与你的问题无关……啊,是的,我确实有一个malloc错误。我试图在结构中分配一个结构数组,但错误地尝试分配指针中的每个元素,而不是分配数字*sizeof(struct)。现在可以用了,谢谢!