Подтвердить что ты не робот

Как использовать MallocStackLogging на устройстве?

У меня проблема с памятью в iPhone-приложении, которое я бы хотел отлаживать с помощью MallocStackLogging. Ошибка связана с гироскопом, поэтому я должен отлаживать устройство, а не симулятор.

Я установил переменную среды MallocStackLogging, и iPhone правильно записывает журналы стека mallock:

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/

Теперь, как я могу работать с ними?

Я могу перенести их на Mac с помощью Xcode Organizer. Но что мне делать с этими двумя файлами?

  • стек logs.1856.MyApp.index
  • stack-logs.1856.MyApp.e8z3IL.link

Я попытался переместить файлы в /tmp на Mac и вызвал:

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

Очевидно, что команда malloc_history ищет запущенные процессы на локальной машине. Я не могу указать файл журнала вручную.

Есть ли способ заставить это работать либо напрямую работать с Xcode на (не-jailbroken) устройстве, либо после переноса журналов на Mac?

4b9b3361

Ответ 1

Вот как я отлаживаю APP с историей стека malloc на idevice, это действительно усложняет, но у меня нет другого способа справиться с проблемой памяти пула автоматического выпуска.

  • Вам нужен Jailbreak idevice с установленными инструментами разработчика, тогда у вас есть gdb.

  • Чтобы включить loglog в стек malloc, вам нужно установить переменные среды MallocStackLoggingNoCompact и MallocStackLogging, нам нужно сделать какой-то трюк.

Во-первых, нам нужно предоставить привилегии для вашего приложения.

 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

Переименуйте свою программу

mv YOUR_APP.app/YOUR_APP   YOUR_APP.app/BACK_UP_NAME

Используйте короткую оболочку для запуска вашей программы, чтобы мы могли сохранить env. Сохраните его на YOUR_APP.app/YOUR_APP

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

exec /Applications/YOUR_APP.app/BACK_UP_NAME

Готово.

Просто запустите приложение, коснувшись значка или используйте команду open, вы увидите файл журнала стека в /tmp каталог.

Использовать ps aux | grep YOUR_APP найти идентификатор процесса, gdb -p PROCESS_ID присоединить к прогрессу, создать точку останова, попробовать info malloc ADDRESS, появится история malloc.

Ответ 2

В приложении "Инструменты", которое может диагностировать приложение, работающее в симуляторе или на устройстве, инструмент Allocations записывает адреса памяти и истории распределения. Вы можете просматривать объект/тип распределения или определенный адрес памяти. Это, пожалуй, самый простой способ выполнить то, что вы хотите.

Запуск malloc_history на устройстве потребует либо джейлбрейка, чтобы включить ssh-соединение с устройством, либо запустить malloc_history из вашего кода. Но я не уверен, существует ли malloc_history на устройстве iOS. И в тексте справки malloc_history не упоминается опция для работы с файлами журнала, а не с существующим процессом, который вы, вероятно, уже знаете.

Ответ 3

Я не хочу звучать легкомысленно, но попробовали ли вы подключить устройство и запустить его под отладчиком при подключении?

Я выполняю обширную отладку при запуске приложения на устройстве. Вам нужно запустить приложение под отладчиком.