Как использовать MallocStackLogging на устройстве?
У меня проблема с памятью в приложении для iPhone, с которой я хотел бы отладить MallocStackLogging
, Ошибка связана с гироскопом, поэтому я должен отлаживать устройство, а не симулятор.
Я установил MallocStackLogging
переменная окружения, и iPhone правильно записывает журналы стека вредоносных программ:
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 на (не взломанном) устройстве, либо после передачи журналов на Mac?
3 ответа
Вот как я отлаживаю APP с историей стека malloc на idevice, это действительно сложно, но у меня нет другого способа справиться с проблемой памяти пула автоматического выпуска.
Вам нужен идеал для джейлбрейка с установленными инструментами разработчика, тогда у вас есть GDB.
Чтобы включить ведение журнала стека malloc, вам нужно установить переменные окружения MallocStackLoggingNoCompact и MallocStackLogging, для этого нужен какой-то трюк.
Во-первых, нам нужно предоставить root-права вашему приложению.
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 покажет.
В приложении Instruments, которое может диагностировать приложение, запущенное в симуляторе или на устройстве, инструмент Allocations записывает адреса памяти и истории распределения. Вы можете просматривать по объекту / типу выделения или конкретному адресу памяти. Это, вероятно, самый простой способ выполнить то, что вы хотите.
Запуск malloc_history на устройстве потребует либо джейлбрейка для включения ssh-подключения к устройству, либо запуска malloc_history из вашего кода. Но я не уверен, существует ли malloc_history на устройстве iOS. А в тексте справки malloc_history не упоминается опция работы с файлами журналов, а не существующий процесс, о котором вы, вероятно, уже знаете.
Я не хочу показаться легкомысленным, но вы пытались подключить устройство и запустить его под отладчиком во время подключения?
Я выполняю обширную отладку, пока запускаю приложение на устройстве. Вам нужно запустить приложение под отладчиком.