代码之家  ›  专栏  ›  技术社区  ›  Tim James

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

  •  16
  • Tim James  · 技术社区  · 15 年前

    我们发现我们复杂的iPhone应用程序(Objc,C++,JavaScript /WebKIT)在异常情况下泄露文件描述符。

    我需要知道哪些文件(按文件路径)保持打开状态。

    我想要类似于BSD命令“lsof”的东西,当然,这在iOS 4中是不可用的,至少对我来说不是。理想情况下是C或ObjC函数。或工具,如鲨鱼或乐器。只需要我们正在运行的应用程序的文件,而不是所有应用程序/进程的文件(与lsof一样)。

    我们对文件做各种各样的事情,而“打开的文件太多”导致的代码失败已经很久没有改变了,而且由于情况不寻常,这可能在几个月前就已经发生了。所以没有必要提醒我查看打开文件的代码并确保关闭它们。我已经知道了。如果能用lsof风格的东西缩小范围就好了。谢谢。

    6 回复  |  直到 15 年前
        1
  •  30
  •   Rich Waters    13 年前
    #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 ; 
        }
    }
    
        2
  •  2
  •   David Gelhar    15 年前

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


    更新:

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

        3
  •  2
  •   Jim Buck    15 年前

    你不能截取所有用你自己的函数打开的文件,比如 my_fopen

        4
  •  2
  •   Ryan    15 年前

    如果仪器不能很好地满足您的需要,我的下一个建议是在模拟器中运行您的应用程序,并在命令行上使用fs_来跟踪您正在打开和关闭的文件描述符。像这样的:

    1. 在终端中,运行“sudo fs_usage-f filesys MyAppName”,用应用程序的名称替换MyAppName。
    2. 启动应用程序。
        5
  •  1
  •   Ryan    15 年前

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

        6
  •  0
  •   Coxy    15 年前

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