Могу ли я найти библиотеку, которая создала именованный OSMallocTag? - PullRequest
1 голос
/ 15 декабря 2010

Я использую инструмент распределения для измерения использования кучи в моем приложении для iOS. Я считаю, что в области с значением тега «Memory Tag 70» выделяется значительный объем памяти, и я хотел бы знать, кто за это отвечает, чтобы я мог отследить:

  • уместно ли мне попытаться что-нибудь сделать с этой памятью
  • если это так, что мне следует с этим делать (т.е. какой код выделяет объекты в этом регионе).

Итак, можно ли отследить, откуда поступил вызов OSMalloc_tagAlloc() с конкретными аргументами? Я согласен с тем, что я могу сделать это только при работе в симуляторе, а не на устройстве. Но даже если это так, как бы я поступил? Могу ли я заставить dtrace показывать мне имена тегов, если да, могу ли я запустить свое приложение в симуляторе через dtrace -c? Как?

Ответы [ 2 ]

0 голосов
/ 11 января 2011

Для меня этот тег был связан с большими UIImages, которые я выделил. Я провел некоторое исследование того, как вы можете получить больше информации об этом и предложить некоторые (возможно) полезные вещи.

Я полагаю, что интересующие вас теги передаются через аргумент flags vm_allocate и аналогичных, а не OSMalloc_tagAlloc (). В примечаниях к выпуску iOS 3.1 упоминается заголовок и в связи с инструментом VM.

Я думаю, что тег передается через параметр флагов vm_allocate в соответствии с VM_FLAGS_ALIAS_MASK vm_statistics.h и после #defines. (Их здесь называют «псевдонимами».) Это означает, что вы должны быть в состоянии создать сценарий dtrace, который, например, проверяет vm_allocate и извлекает тег из параметра flags. Например:

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

Вы можете использовать инструменты для создания инструмента dtrace и запуска на симуляторе iOS через «Создать новый инструмент ...» в меню «Инструмент», или вы можете использовать сценарий командной строки dtrace и включить / pid == 123456 / предикат для вашего работающего приложения.

К сожалению, мне не удалось найти правильный зонд, чтобы найти эти распределения. При проверке соответствующей переменной argN у флагов всегда есть 0 в части tag / alia. Я пробовал, например, fbt: mach_kernel: vm_allocate, как указано выше, fbt: mach_kernel: mach_vm_allocate, fbt: mach_kernel: vm_map_enter и т. Д. Возможно, эти выделения проходят через какой-то другой путь? Я не знаю много о системе распределения памяти в ядре.

Итак, я не совсем уверен, куда эти теги передаются ядру, но я надеюсь, что это поможет вам отследить его.

0 голосов
/ 06 января 2011

В инструментах вы можете переключаться между различными дисплеями, выбирая всплывающее окно, которое находится в разделителе между верхней и нижней частью окна.Для «Распределения» вы можете переключить его, чтобы показать «Деревья вызовов» (я думаю, что по умолчанию это «Статистика»).

Это должно дать вам стеки вызовов для всех распределений.Я, однако, не уверен, будет ли он проходить весь путь от ядра до пространства пользователя.

...