2013-12-15 3 views
1

Существует недокументированная (частная) инфраструктура для OS X, называемая MobileDevice. Он используется для получения данных с устройств iOS. Я занимаюсь написанием приложения, которое его использует, и я хочу, чтобы можно было извлечь количество циклов зарядки на батарею устройства iOS. Функция для этого в MobileDevice называется AMDeviceCopyValue(). Он принимает 3 аргумента: адрес устройства (просто целое число), домен значения, которое вы хотите скопировать (строка C), и ключ значения, которое вы хотите скопировать (другая строка C.)LLDB: печатать переменные, переданные функции каждый раз, когда он вызывается?

Поскольку эта структура не задокументирована, трудно найти, какие строки вам нужно использовать. Некоторые из них размещены в Интернете, но не для подсчета циклов заряда. Еще одна программа, которую я нашел в Интернете уже делает это, iCopyBot: http://www.icopybot.com/blog/check-ipad-iphone-battery-charge-cycle-count-without-jailbreaking.htm

Я хотел бы запустить iCopyBot в LLDB, а затем LLDB распечатать домена и ключевых аргументов, iCopyBot переходит к AMDeviceCopyValue() каждый раз, когда он называется. Структура чувствительна к срокам, поэтому я не могу остановить ее в середине исполнения - ей нужно просто распечатать аргументы, которые были переданы и продолжаются.

Может ли кто-нибудь показать мне, что я должен сделать? Я уже успел запустить iCopyBot в LLDB, и каждый раз, когда вызывается эта функция, я устанавливаю точку останова, но команда «frame variable» не печатает ничего для меня (документация для LLDB, которую я получил от веб-сайта Apple предполагает, что он должен напечатать аргументы, которые были переданы в ... он не работает для меня)

+0

Вы можете установить точку останова на 'AMDeviceCopyValue' и распечатать аргументы, пока программа является приостановленным. –

+0

@ H2CO3 - Мне удалось заставить его приостановить, когда вызывается функция, но «переменная кадра» ничего не распечатывает для меня.И поскольку это функция C, о которой мы говорим, я не думаю, что имена переменных, используемые в исходном коде, будут храниться в скомпилированном коде, не так ли? – ArtOfWarfare

+0

, только если модуль, в котором находится данная функция, был скомпилирован с помощью отладочных символов. –

ответ

7

предположить, что узнал от моего обсуждения в комментариях вопрос с Н2СО3:.

Вы можете загрузить любую программу, которую вы хотите в LLDB, введя следующую команду:

lldb <path to application executable> 

Чтобы установить точку останова на функцию, введите следующая команда после lldb начала:

breakpoint set -b <name of function> 

Чтобы действительно запустить программу в lldb, введите следующий раз он будет загружен и имеет контрольные точки вы хотите:

run 

Чтобы просмотреть переменные в контрольной точке даже без символов отладчика (IE, потому что это не программа, которая у вас есть источник) введите:

register read 

Если что-то в списке выглядит она имеет CoreFoun мендациях или объект Obj-C, введите следующую команду:

po <register of object> 

И, наконец, если вы думаете, что есть строка C будучи указывает одной из переменных, вы можете использовать это:

p (char*)<register of string> 

Там в гораздо больше вы можете делать с lldb, чем я здесь. Просто введите help из командной строки lldb, чтобы узнать больше о том, что он может сделать. Это охватывает все, что я хотел знать, когда я впервые опубликовал этот вопрос вчера.

Смежные вопросы