在iOS / iPhone上:“打开的文件过多”:需要列出打开的文件(如lsof)

我们发现我们复杂的iPhone应用程序(ObjC,C ++,JavaScript / WebKit)在特殊情况下泄漏文件描述符。

我需要知道哪些文件(通过文件path)我们打开。

我想要的东西就像BSD命令“lsof”,当然,这在iOS 4中是不可用的,至less不是我。 理想的C或ObjC函数。 或者一个工具,如鲨鱼或乐器。 只需要我们正在运行的应用程序的文件,而不是所有的应用程序/进程(与lsof)。

我们用文件做了各种各样的事情,“打开文件太多”的代码没有改变,由于情况不同常常会在几个月前出现。 所以没有必要提醒我看看打开文件的代码,并确保closures它们。 我已经知道了。 很高兴把它缩小一些类似的东西。 谢谢。

#import <sys/types.h> #import <fcntl.h> #import <errno.h> #import <sys/param.h> +(void) lsof { int flags; int fd; char buf[MAXPATHLEN+1] ; int n = 1 ; for (fd = 0; fd < (int) FD_SETSIZE; fd++) { errno = 0; flags = fcntl(fd, F_GETFD, 0); if (flags == -1 && errno) { if (errno != EBADF) { return ; } else continue; } fcntl(fd , F_GETPATH, buf ) ; NSLog( @"File Descriptor %d number %d in use for: %s",fd,n , buf ) ; ++n ; } } 

你能重现在模拟器中运行的问题吗?

如果是这样,那么你实际上可以使用“lsof”…


更新:

好吧,如果你不能使用模拟器,那么想法#2:

当你得到“太多的打开的文件”的错误,调用一个函数,遍历所有打开的文件描述符,并转储一些信息(例如长度和前几个字节)。

你不能用自己的函数拦截所有的文件打开,比如说my_fopen ,并且把描述符和它们的名字一起存储起来,这样当打开太多文件的时候,你可以通过你的列表来看看所有的描述符是什么?

如果Instruments不适合您的工作,我的下一个build议是在模拟器中运行您的应用程序,并在命令行中使用fs_usage来跟踪您打开和closures的文件描述符。 像这样的东西:

  1. 在terminal中,运行“sudo fs_usage -f filesys MyAppName”,将MyAppNamereplace为您的应用程序的名称。
  2. 启动你的应用程序。
  3. 查看fs_usage输出的文件描述符打开和closures命令以查看打开的文件。

Instruments.app可能会帮助你(/Developer/Applications/Instruments.app)。 使用“乐器”中的“系统使用”工具运行您的应用程序,它可能会向您显示您需要知道的内容。 最重要的是,它可以在您的设备上运行应用程序时使用,而不越狱。

我build议你在越狱iPhone上运行你的应用程序,并使用Backgrounder和MobileTerminal来查看当前打开的文件。

你可以在这里得到一个lsof的iPhone二进制文件: http ://modmyi.com/cydia/package.php?id= 6945