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

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

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

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

2 ответа

Для меня этот тег был связан с большими 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 и т. Д. Возможно, эти выделения проходят через какой-то другой путь? Я не знаю много о системе распределения памяти в ядре.

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

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

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

Другие вопросы по тегам