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