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

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

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

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


person Community    schedule 15.12.2010    source источник
comment
Хммм... Метка памяти 70 может быть iOS-эквивалентом Зоны 51.   -  person Claus Broch    schedule 15.12.2010
comment
@GrahamLee: Извини, мой плохой. Это была ошибка с моей стороны. В сообщении stackoverflow.com/questions/10025724/. Я прошу прощения за это. Ничего личного :)   -  person Parth Bhatt    schedule 05.04.2012


Ответы (2)


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

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

person Claus Broch    schedule 06.01.2011

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

Я полагаю, что интересующие вас теги передаются через аргумент flags функции vm_allocate и т.п., а не OSMalloc_tagAlloc(). В примечаниях к выпуску iOS 3.1 упоминаются заголовки ‹mach/vm_statistics.h> и ‹mach/vm_map.h> в связи с инструментом VM.

Я думаю, что тег передается через параметр флагов vm_allocate в соответствии с VM_FLAGS_ALIAS_MASK vm_statistics.h и после #define. (Здесь они называются «псевдонимами».) Это означает, что вы должны иметь возможность создать скрипт 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 в части тега/псевдонима. Я пробовал, например, fbt:mach_kernel:vm_allocate, как указано выше, fbt:mach_kernel:mach_vm_allocate, fbt:mach_kernel:vm_map_enter и т. д. Возможно, эти распределения происходят по какому-то другому пути? Я мало знаю о системе распределения памяти ядра.

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

person Jesse Rusak    schedule 11.01.2011