lldb python basic — вывести значение глобального массива, находясь внутри точки останова в функции

(Некоторая предыстория: у меня нет опыта работы с lldb или python, и я не часто работаю над ними, но в настоящее время мне нужно создать некоторые базовые сценарии для отладки программы iphone)

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

Этот массив объявлен как

Float32 my_array[128];  

и имеет глобальную область действия. Я могу просмотреть массив с помощью команды печати, но я хотел бы создать скрипт на Python, чтобы иметь больший контроль над форматированием вывода и, возможно, отображать элементы массива в виде графика с использованием matplolib позже.

Я просматриваю пример кода Python, данный в этом вопросе, и использую python, указанный там, я проверил, что могу просматривать локальные переменные в этой функции (где в настоящее время я остановлен в точке останова). Например, если я заменю «базу» в base=frame.FindVariable('base') на свою локальную переменную «k» (локальная переменная не является массивом),

base=frame.FindVariable('k')  

затем print base я вижу значение k. Однако, если я попробую это,

base=frame.FindVariable('my_array')   

и сделать print base это дает мне No value. Как я могу написать команду python, чтобы получить значения любой переменной, находящейся в настоящее время? Предпочтительно это работает для обычных переменных (int, float), массивов и указателей, но если нет, то на данный момент важнее найти значения массивов.


person user13267    schedule 16.11.2018    source источник


Ответы (1)


SBFrame.FindVariable выполняет поиск среди переменных, локальных для этого фрейма. Он не ищет среди глобальных переменных.

Для этого вам нужно использовать поиск с более широким охватом. Если вы знаете, что глобальная переменная находится в двоичном изображении, содержащем код вашего фрейма — lldb называет это двоичное изображение Module — тогда вы можете найти модуль, содержащий этот фрейм, и использовать SBModule.FindGlobalVariables. Если это не так, вы можете найти всю цель, используя SBTarget.FindGlobalVariables. Если вы знаете, что существует только одна глобальная переменная с таким именем, вы можете использовать вариант FindFirstGlobalVariable.

Все эти команды будут находить переменные любого типа, и все они последовательно возвращают SBValue, поэтому вы можете форматировать их согласованным образом, независимо от того, как вы их находите. Для статически выделенных массивов элементы массива являются его дочерними элементами, поэтому вы можете получить отдельные элементы с помощью SBValue.GetChildAtIndex.

Вы можете добраться до модуля SBFrame, например:

module = frame.module

и его цель:

target = frame.thread.process.target

lldb разделяет контексты, в которых нужно искать переменные, прежде всего для эффективности. Если бы SBFrame.FindVariable искал не только локальные, но и глобальные переменные, опечатка в имени переменной обошлась бы гораздо дороже. Но это также делает вызов более предсказуемым, поскольку вы никогда не получите какую-то случайную глобальную переменную из какой-то разделяемой библиотеки, которую система загрузила от вашего имени.

person Jim Ingham    schedule 16.11.2018
comment
привет Мне удалось прочитать значения отдельных элементов массива в lldb python благодаря вашей помощи, но главное, что я хотел сделать, отобразить значения массива на графике с помощью matplotlib, не работает. Не могли бы вы взглянуть на мой другой вопрос, пожалуйста? stackoverflow.com/questions/53367537 / - person user13267; 19.11.2018
comment
Недавно я нашел ваш ответ здесь: stackoverflow.com/a/36706767/1693203 Означает ли это, что создание maltplotlib из терминала Xcode lldb невозможный? - person user13267; 19.11.2018
comment
Я думаю, что лучше отказаться от matplotlib из консоли Xcode lldb. Не могли бы вы взглянуть на мой другой вопрос, пожалуйста? stackoverflow.com/questions/53373971/ - person user13267; 19.11.2018
comment
Проблема, с которой я столкнулся, заключается в том, что когда я пишу служебный скрипт, который обращается к переменной, как мне узнать, когда он вызывается, в каком кадре он находится? Есть ли служебная функция, которая позволяет мне найти ближайшую переменную, например, локальную переменную фрейма, если есть еще глобальная? Я сделал это вручную ix.io/3rri/python . Сообщение редактирования: я перечитал ваш ответ, и мне, вероятно, нужно больше понять глобальные переменные python, чтобы понять проблему. - person RichieHH; 29.06.2021