正在调试fopen和fclose,打开的文件太多
我使用的是Windows7,使用的是正在调试fopen和fclose,打开的文件太多,c,fopen,fclose,C,Fopen,Fclose,我使用的是Windows7,使用的是gcc版本4.8.1。我有一个大型的多线程C程序,它对fopen和fclose进行大量调用。如果它运行的时间足够长,它将无法打开文件。我使用进行了调试,发现打开的文件太多错误,尽管一次打开的文件不应该超过几个。我已经查看了很多次代码,但都找不到bug(对于fopen的每个调用,都有一个对应的fclose调用被执行,并且没有函数使用多个文件*变量)。有进一步的调试建议吗?特别是有没有返回当前打开的文件数的函数 这是一个“经典”的资源泄漏问题。很可能存在一个代码路
gcc版本4.8.1
。我有一个大型的多线程C程序,它对fopen
和fclose
进行大量调用。如果它运行的时间足够长,它将无法打开文件。我使用
进行了调试,发现打开的文件太多
错误,尽管一次打开的文件不应该超过几个。我已经查看了很多次代码,但都找不到bug(对于fopen
的每个调用,都有一个对应的fclose
调用被执行,并且没有函数使用多个文件*
变量)。有进一步的调试建议吗?特别是有没有返回当前打开的文件数的函数 这是一个“经典”的资源泄漏问题。很可能存在一个代码路径,在该路径中文件被打开但未关闭。错误处理代码路径是常见的可疑问题之一。您可以在web上搜索“debug resource leaks c”或类似内容
查找用于跟踪内存资源泄漏的工具的信息会更容易(我刚刚在谷歌上搜索过)。您可以使用内存资源泄漏工具来解决此问题,方法是每次打开文件时分配一小块内存,然后在关闭文件时释放内存。如果内存泄漏工具是一个相当好的工具,If将为任何泄漏内存提供堆栈跟踪或源文件/行号。该位置将位于打开的文件旁边。每次打开和关闭文件时,使用文件名或其他标识信息调用
fprintf()
到stderr
,这是一种明显的启动策略,因此您可以看到哪些文件正在打开,而哪些文件没有关闭。可能是,线程关闭文件的速度不够快,或者线程太多。如果它在Linux上,您可以使用/proc/sys/fs/file nr
查找打开的fds。发布相关信息,如总线程数、在创建更多线程之前是否关闭文件等将有所帮助。或者可能是一个错误。错误在于您一次使用的文件太多。也许重新思考不会出错只有4个线程,并且一次只能打开几个文件。所有对fopen的调用都是在“r”模式下使用的,所以我假设没有线程安全问题。这是正确的吗?