Как использовать MallocStackLogging на устройстве? - PullRequest
32 голосов
/ 02 марта 2011

У меня проблема с памятью в приложении для 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 ]

4 голосов
/ 05 марта 2014

Вот как я отлаживаю 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.

2 голосов
/ 16 сентября 2013

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

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

0 голосов
/ 14 марта 2011

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

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

...