32 votes

Comment utiliser MallocStackLogging sur l'appareil?

J'ai un problème de mémoire dans une application iPhone que j'aimerais debug avec MallocStackLogging. L'erreur consiste à le gyroscope, j'ai donc de débogage sur l'appareil et non le simulateur.

J'ai mis l' MallocStackLogging variable d'environnement et l'iPhone correctement enregistre la mallock pile de journaux:

MyApp(1856) malloc: recording malloc stacks to disk using standard recorder
MyApp(1856) malloc: stack logs being written into /private/var/mobile/Applications/1FD1F8D2-5D30-4AA7-B426-C52FE20266DE/tmp/stack-logs.1856.MyApp.index
MyApp(1856) malloc: Please issue: cp /private/var/mobile/Applications/1FD1F8D2-5D30-4AA7- B426-C52FE20266DE/tmp/stack-logs.1856.MyApp.e8z3IL.link /tmp/

Maintenant, comment puis-je travailler avec eux?

Je peux les transférer vers le Mac avec Xcode Organisateur. Mais que dois-je faire avec ces deux fichiers?

  • la pile de journaux.1856.MyApp.index
  • la pile de journaux.1856.MyApp.e8z3IL.lien

J'ai essayé de déplacer les fichiers dans /tmp sur le Mac et l'appelle:

$ malloc_history 1856 -all_events
malloc_history cannot examine process 1856 because the process does not exist.

Clairement, l' malloc_history commande recherche pour les processus en cours d'exécution sur la machine locale. Je suis en manque une option pour spécifier le fichier journal manuellement.

Est-il possible d'obtenir que cela fonctionne, soit en travaillant directement avec Xcode sur la (non jailbreaké) de l'appareil ou après le transfert des journaux vers le Mac?

4voto

user3383333 Points 46

Voici comment je déboguer une APPLICATION avec des malloc de la pile de l'histoire sur l'idevice, c'est vraiment compliquer, mais je n'ai pas d'autre façon de traiter avec un auto release piscine problème de mémoire.

  1. Vous avez besoin d'Un jailbreak idevice avec les outils de développement installé, alors vous avez gdb.

  2. Pour activer la fonction malloc de la pile loggin, vous devez définir les variables d'environnement MallocStackLoggingNoCompact et MallocStackLogging, nous avons besoin d'une astuce pour le faire.

Tout d'abord, nous devons accorder à votre application les privilèges de root.

 mv -f /User/Application/xxxxxxxxxxxxx/YOUR_APP.app /Application/YOUR_APP.app
 cd /Application
 chown -R root:wheel YOUR_APP.app
 chmod 4755 YOUR_APP.app/YOUR_APP

Renommer votre programme

mv YOUR_APP.app/YOUR_APP   YOUR_APP.app/BACK_UP_NAME

Un shell script pour démarrer votre programme, afin que nous puissions garder l'env. Enregistrer YOUR_APP.app/YOUR_APP

#!/bin/bash
export MallocStackLogging=1
export MallocStackLoggingNoCompact=1

exec /Applications/YOUR_APP.app/BACK_UP_NAME

Fait.

Juste au démarrage de votre application, en le touchant sur l'icône ou de l'utilisation de la commande d'ouverture, vous verrez une pile fichier de log dans /tmp répertoire.

Utiliser ps aux | grep YOUR_APP trouver l'id du processus, gdb -p PROCESS_ID joindre au progrès, à faire un point d'arrêt, essayez info malloc ADDRESS, malloc l'histoire va se montrer.

2voto

bneely Points 4860

Dans les Instruments de l'application, qui permet de diagnostiquer une application qui s'exécute dans le simulateur ou sur un périphérique, les Allocations instrument enregistre les adresses de mémoire et de répartition des histoires. Vous pouvez accéder à l'objet ou de l'attribution ou de type de mémoire spécifique de l'adresse. C'est probablement la façon la plus simple pour faire ce que vous voulez.

L'exécution de malloc_history sur le dispositif nécessiterait soit de jailbreak pour permettre une connexion ssh à l'appareil ou à l'exécution de malloc_history à partir de votre code. Mais je ne suis pas certain que malloc_history existe sur un appareil iOS. Et malloc_history l'aide de texte ne mentionne pas une option pour les opérations sur les fichiers journaux plutôt que d'un processus existant, lequel vous savez probablement déjà.

-4voto

ferdil Points 667

Je ne veux pas paraître désinvolte, mais avez-vous essayé de brancher l'appareil et de l'exécuter sous le débogueur alors qu'il était connecté?

Je fais beaucoup de débogage lors de l'exécution de l'application sur le périphérique. Vous devez démarrer l'application sous le débogueur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X