en iOS / iPhone: "Demasiados files abiertos": necesita enumerar los files abiertos (como lsof)

Descubrimos que nuestra compleja aplicación de iPhone (ObjC, C ++, JavaScript / WebKit) tiene escapes de descriptores de files en circunstancias inusuales.

Necesito saber qué files (por ruta de file) nos estamos dejando abiertos.

Quiero algo así como el command BSD "lsof", que, por supuesto, no está disponible en iOS 4, al less no para mí. Idealmente una function C o ObjC. O una herramienta, como tiburones o instrumentos. Solo necesita los files para nuestra aplicación en ejecución, no (como con lsof) para todas las aplicaciones / processs.

Hacemos todo tipo de cosas con files, y el código que falla con "Demasiados files abiertos" no ha cambiado en edades, y dado que las circunstancias son inusuales, esto podría haberse deslizado hace meses. Así que no hay necesidad de recordarme que mire el código que abre los files y asegúrese de cerrarlos. Ya lo se. Sería bueno networkingucirlo con algo lsof-esque. Gracias.

#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 ; } } 

¿Puedes reproducir el problema que se ejecuta en el simulador?

Si es así, entonces podrías usar "lsof" …


actualizar:

Ok, si no puedes usar el simulador, entonces la idea # 2:

Cuando obtenga el error "demasiados files abiertos", llame a una function que repite a través de todos los descriptores de file abierto y vuelca información sobre cada uno (por ejemplo, la longitud y los primeros bytes).

¿No puede interceptar todos los files my_fopen con su propia function, digamos my_fopen , y almacenar los descriptores junto con sus nombres para que cuando tenga demasiados files abiertos, pueda revisar su list para ver qué está tomando todos los descriptores?

Si Instruments no funciona bien para sus propósitos, mi siguiente recomendación sería ejecutar su aplicación en el simulador y usar fs_usage en la línea de command para rastrear los descriptores de file que está abriendo y cerrando. Algo como esto:

  1. En Terminal, ejecute "sudo fs_usage -f filesys MyAppName", reemplazando MyAppName con el nombre de su aplicación.
  2. Lanza tu aplicación.
  3. Mire el descriptor de file abierto y cierre los commands enviados por fs_usage para ver qué files deja abiertos.

Instruments.app puede ayudarlo (/Developer/Applications/Instruments.app). Ejecute su aplicación con la herramienta Uso del sistema en Instrumentos, y probablemente le mostrará lo que necesita saber. Lo mejor de todo, se puede usar mientras se ejecuta la aplicación en su dispositivo, sin jailbreaking.

Sugiero que ejecute su aplicación en un iPhone jailbroken, y use Backgrounder y MobileTerminal para ver los files actualmente abiertos.

Puede get un binary de iPhone de lsof aquí: http://modmyi.com/cydia/package.php?id=6945