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

  1. Вам нужен идеал для джейлбрейка с установленными инструментами разработчика, тогда у вас есть GDB.

  2. Чтобы включить ведение журнала стека 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 не упоминается опция работы с файлами журналов, а не существующий процесс, о котором вы, вероятно, уже знаете.

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

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

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