lldb python basic - выводит значение глобального массива внутри точки останова в функции - PullRequest
0 голосов
/ 16 ноября 2018

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

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

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

Float32 my_array[128];  

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

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

base=frame.FindVariable('k')  

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

base=frame.FindVariable('my_array')   

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

1 Ответ

0 голосов
/ 16 ноября 2018

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

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

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

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

module = frame.module

и его цель:

target = frame.thread.process.target

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

...