sur iOS / iPhone: "Trop de fichiers ouverts": nécessité de lister les fichiers ouverts (comme lsof)
Nous avons découvert la complexité de notre application iPhone (ObjC, C++, JavaScript/WebKit) est une fuite de descripteurs de fichiers dans des circonstances inhabituelles.
J'ai besoin de savoir quels fichiers (par le chemin d'accès au fichier) nous sommes à la sortie de l'ouvrir.
Je veux quelque chose comme la BSD commande "lsof", ce qui, bien sûr, n'est pas disponible dans iOS 4, au moins pas pour moi. Idéalement, un C ou ObjC fonction. Ou d'un outil, comme les requins ou les Instruments. Juste besoin de fichiers pour notre application en cours d'exécution, et non pas (comme avec lsof) pour toutes les applications/processus.
Nous faire toutes sortes de choses avec les fichiers, et le code qui est un échec avec "Trop de fichiers ouverts" n'a pas changé depuis des lustres, et étant donné que les circonstances sont inhabituelles, ce qui pourrait avoir glissée dans le mois. Il n'ya donc pas besoin de me rappeler de regarder le code qui ouvre les fichiers et assurez-vous que je les ferme. Je le savais déjà. Serait bien de le réduire à quelque chose de lsof-esque. Merci.
source d'informationauteur Tim James | 2010-11-03
Vous devez vous connecter pour publier un commentaire.
Pouvez-vous reproduire le problème en cours d'exécution dans le simulateur?
Si oui, alors vous pouvez utiliser "lsof"...
mise à jour:
Ok, si vous ne pouvez pas utiliser le simulateur, puis idée #2:
Lorsque vous obtenez le "trop de fichiers ouverts" erreur, appeler une fonction qui parcourt tous les descripteurs de fichiers ouverts et les décharges d'information (par exemple la longueur et les premiers octets).
Ne pouvez-vous pas juste intercepter tous les fichier s'ouvre avec votre propre fonction, dire
my_fopen
et de stocker les descripteurs avec leurs noms, de sorte que lorsque vous avez trop de fichiers ouverts, vous pouvez passer par votre liste pour voir ce qui est à prendre tous les descripteurs?Si les Instruments ne fonctionne pas bien pour vous, mon prochain recommandation serait de exécuter votre application dans le simulateur, et l'utilisation fs_usage sur la ligne de commande pour suivre les descripteurs de fichiers vous êtes d'ouverture et de fermeture. Quelque chose comme ceci:
Instruments.application pourrait être en mesure pour vous aider à (/Developer/Applications/Instruments.app). Exécuter votre application en utilisant le Système d'Utilisation de l'outil dans les Instruments, et il va probablement vous montrer ce que vous devez savoir. Le meilleur de tous, il peut être utilisé lors de l'exécution de l'application sur votre appareil, sans jailbreak.
Je vous suggère d'exécuter votre application sur un iPhone jailbreaké, et d'utiliser le Document d'information et MobileTerminal de prendre un coup d'oeil sur le fichier actuellement ouvert.
Vous pouvez obtenir un iPhone binaire de lsof ici: http://modmyi.com/cydia/package.php?id=6945