2010-12-15 56 views
1

J'utilise l'instrument d'allocations pour mesurer l'utilisation du tas dans mon application iOS. Je trouve qu'une quantité importante de mémoire est allouée dans une région avec le nom de la balise « Tag mémoire 70 », et je voudrais savoir qui est responsable de ce que je peux donc chasser:Puis-je trouver la bibliothèque qui a créé un OSMallocTag nommé?

  • que ce soit approprié pour moi pour essayer et faire quelque chose à propos de cette mémoire
  • si oui, ce que je devrais faire à ce sujet (c'est à dire quel code alloue des objets dans cette région).

Donc, puis-je savoir où un appel à OSMalloc_tagAlloc() avec des arguments particuliers vient? Je suis prêt à accepter que je ne peux le faire que lorsque je cours dans le simulateur, pas sur l'appareil. Mais même si c'est le cas, comment pourrais-je m'y prendre? Puis-je obtenir le dtrace pour me montrer les noms des étiquettes, si oui puis-je lancer mon application dans le simulateur via dtrace -c? Comment?

+1

Hmmm ... "Memory Tag 70" peut être l'équivalent iOS de "Area 51". –

+0

@GrahamLee: Désolé mon mauvais. C'était une erreur de ma part. Sur le post http://stackoverflow.com/questions/10025724/nsfilemanager-cant-create-file. Je suis désolé pour ça. Rien de personnel :) –

Répondre

0

Dans les instruments, vous pouvez basculer entre différents affichages en sélectionnant le menu contextuel qui se trouve dans le séparateur entre les sections supérieure et inférieure de la fenêtre. Pour "Allocations" vous pouvez le changer pour montrer "Call Trees" (je pense que par défaut "Statistiques").

Cela devrait vous donner des piles d'appels pour toutes les allocations. Je ne suis cependant pas sûr que cela puisse aller du noyau à l'espace utilisateur.

0

Pour moi, cette balise était liée aux grandes UIImages que j'avais allouées. J'ai fait une enquête sur la façon dont vous pourriez obtenir plus d'informations à ce sujet et avoir des choses (peut-être) utiles à suggérer.

Je crois que les étiquettes qui vous intéressent sont celles qui sont passées via l'argument flags de vm_allocate et similaire, pas OSMalloc_tagAlloc(). Les notes de publication d'iOS 3.1 mentionnent l'en-tête < mach/vm_statistics.h> et < mach/vm_map.h> en rapport avec l'instrument VM.

Je pense que la balise est transmise via le paramètre vm_allocate flags selon VM_FLAGS_ALIAS_MASK de vm_statistics.h et #defines suivantes. (Ils sont appelés "alias" ici.) Cela signifie que vous devriez être capable de créer un script dtrace qui sonde, par exemple, vm_allocate, et extrait la balise du paramètre flags. Par exemple:

sudo dtrace -n 'fbt:mach_kernel:vm_allocate:entry /pid==12345/ { printf("%d", (arg3 & 0xFF000000) >> 24); }'

Vous pouvez utiliser des instruments pour faire un instrument de DTrace et courir contre le simulateur iOS via « Construire nouvel instrument ... » dans le menu « Instrument », ou vous pouvez utiliser utiliser une commande -line dtrace script et inclure un/pid == 123456/predicate pour votre application en cours d'exécution.

Malheureusement, je n'ai pas réussi à trouver la bonne sonde pour trouver ces allocations. Lors de l'inspection de la variable argN appropriée, les indicateurs semblent toujours avoir 0 dans la partie tag/alia. J'ai essayé, par exemple, fbt: mach_kernel: vm_allocate comme ci-dessus, fbt: mach_kernel: mach_vm_allocate, fbt: mach_kernel: vm_map_enter, etc. Peut-être que ces allocations passent par une autre voie? Je ne connais pas grand chose au système d'allocation de mémoire du noyau. Donc, je ne sais pas exactement où ces balises sont passées au noyau, mais j'espère que cela vous aidera à le retrouver.