Начало работы с LLDB

LLDB является средой отладки командной строки с функциональностью, подобной GDB. LLDB обеспечивает базовую среду отладки для XCode, включающего консольную область в область отладки для прямого доступа к командам LLDB в XCode среда IDE.

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

Структура команды LLDB

Все пользователи, начинающие с LLDB, должны знать о структуре команды LLDB и синтаксисе, чтобы коснуться потенциала LLDB и понять, как получить максимум от него. Во многих случаях, команды, предоставленные LLDB — например, list и b— работа точно так же, как команды GDB и делает изучение LLDB проще для опытных пользователей GDB.

Понимание синтаксиса команды

Синтаксис команды LLDB структурирован и регулярный повсюду. Команды LLDB являются всей формой:

<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]

Команда и подкоманда являются именами объектов отладчика LLDB. Команды и подкоманды располагаются в иерархии: определенный объект команды создает контекст для подобъекта команды, следующего за ним, который снова обеспечивает контекст для следующей подкоманды и т.д. Действие является работой, которую Вы хотите выполнить в контексте объединенных объектов отладчика (строка подкоманды команды.. объекты, предшествующие ему). Опции являются модификаторами действия, часто принимающими значение. Параметры представляют множество разных вещей согласно контексту используемой команды — например, с помощью process launch команда для запуска процесса параметры в том контексте - то, что Вы вводите в командную строку, как будто Вы вызывали процесс за пределами сеанса отладки.

Парсинг командной строки LLDB завершается перед выполнением команды. Команды, подкоманды, опции, значения опции и параметры являются всем пробелом, разделенным, и двойные кавычки используются для защиты пробелов в значениях опции и параметрах. Если необходимо поместить наклонную черту влево или символ двойной кавычки в параметр, Вы предшествуете тому символу с наклонной чертой влево в параметре. LLDB использует и одинарные и двойные кавычки эквивалентно, позволяя вдвойне заключенным в кавычки частям командной строки быть записанным легко. Например:

(lldb) command [subcommand] -option "some \"quoted\" string"

может также быть записан:

(lldb) command [subcommand] -option 'some "quoted" string'

Этот проект парсинга команды помогает сделать синтаксис команды LLDB регулярным и универсальным через все команды. (Для пользователей GDB это также означает, что Вам, вероятно, придется заключить некоторые параметры в кавычки в LLDB, что Вы не должны были бы заключать в кавычки в GDB.)

Как пример простой команды LLDB, для установки точки останова в файле test.c в строке 12 Вы входите:

(lldb) breakpoint set --file test.c --line 12

Команды, которые, кажется, отличаются от этой модели — например, print или b— обычно настроенные формы команды, создаваемые command alias механизм, обсужденный в Псевдонимах Команды и Справке.

Используя опции команды

Опции команды в LLDB имеют каноническое (также называемый «поддающимся обнаружению») форма и сокращенная форма. Например, вот частичное перечисление опций команды для breakpoint set команда, перечисляя каноническую форму в круглых скобках:

breakpoint set
       -M <method> ( --method <method> )
       -S <selector> ( --selector <selector> )
       -b <function-name> ( --basename <function-name> )
       -f <filename> ( --file <filename> )
       -l <linenum> ( --line <linenum> )
       -n <function-name> ( --name <function-name> )

Опции могут быть помещены в любой порядок на командную строку после команды. Если параметры начинаются с дефиса (-), Вы указываете к LLDB, что сделаны с опциями для текущей команды путем добавления сигнала завершения опции, двойной дефис (--). Например, если Вы хотите запустить процесс и дать process launch управляйте --stop-at-entry опция, и хочет, чтобы тот же самый процесс был запущен с параметрами -program_arg_1 value и -program_arg_2 value, Вы входите:

(lldb) process launch --stop-at-entry -- -program_arg_1 value -program_arg_2 value

Используя необработанные команды

Синтаксический анализатор команды LLDB поддерживает «необработанные» команды, в которых, после того, как удалены опции команды, остальная часть командной строки передается неинтерпретируемая команде. Это удобно для команд, параметрами которых могло бы быть некоторое сложное выражение, которое будет неуклюже для защиты с наклонными чертами влево. Например, expression команда является необработанной командой.

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

Необработанные команды могут все еще иметь опции, если Ваша командная строка имеет тире в ней, Вы указываете, что это не маркеры опции путем помещения завершения опции (--) после названия команды, но перед командной строкой.

Используя завершение команды в LLDB

LLDB поддерживает завершение команды для имен исходного файла, имен символа, имен файлов, и т.д. Завершение в Окне терминала инициируется путем ввода символа табуляции на командной строке. Завершения в консоли Xcode работают таким же образом завершениями в редакторе исходного кода: завершения раскрываются автоматически после того, как третий символ вводится, и раскрывающиеся завершения могут быть вручную вызваны через ключ Esc (Escape). Кроме того, завершения в консоли Xcode следуют за предпочтениями Редактирования текста XCode, указанными в панели Editing.

Отдельные опции в команде могут иметь различный completers. Например, --file <path> опция в breakpoint завершается к исходным файлам, --shlib <path> опция завершается к в настоящее время загруженным совместно используемым библиотекам и т.д. Поведение может быть довольно определенным — например: если Вы указываете --shlib <path>, и завершаются на --file <path>, LLDB перечисляет только исходные файлы в совместно используемой библиотеке, указанной --shlib <path>.

Сравнение LLDB с GDB

Парсинг командной строки и однородность синтаксического анализатора команды LLDB отличаются при использовании LLDB по сравнению с GDB. Синтаксис команды LLDB иногда вынуждает Вас быть более явными об утверждении Ваших намерений, но это является более регулярным в использовании.

Например, установка точки останова является общей работой. В GDB для установки точки останова Вы могли бы ввести следующий для повреждения в строке 12 из foo.c:

(gdb) break foo.c:12

И Вы могли бы ввести следующий для повреждения в функции foo:

(gdb) break foo

Более сложный break выражения возможны в GDB. Один пример (gdb) break foo.c::foo , что означает, “устанавливает точку останова в функции foo в файле foo.c.” Но в некоторый момент синтаксис GDB становится замысловатым и ограничивает функциональность GDB, особенно в C++, где не может быть никакого надежного способа указать функцию, на которой Вы хотите повредиться. Эти недостатки происходят, потому что синтаксис командной строки GDB поддерживается комплексом специальных синтаксических анализаторов выражения, которые могут противоречить друг другу.

Команда точки останова LLDB, для сравнения, требует только простого, прямого подхода в своем выражении и обеспечивает преимущества интеллектуального автоматического завершения и возможности установить точки останова в более сложных ситуациях. Для установки того же файла и точки прерывания строки в LLDB войдите:

(lldb) breakpoint set --file foo.c --line 12

Установить точку останова на названной функции foo в LLDB войдите:

(lldb) breakpoint set --name foo

Установка точек останова по имени еще более мощна в LLDB, чем в GDB, потому что можно указать, что Вы хотите установить точку останова в функции именем метода. Установить точку останова на всех названных методах C++ foo, войдите:

(lldb) breakpoint set --method foo

Установить точку останова на названных селекторах Objective C alignLeftEdges:, войдите:

(lldb) breakpoint set --selector alignLeftEdges:

Можно ограничить любые точки останова определенным исполнимым изображением при помощи --shlib <path> выражение.

(lldb) breakpoint set --shlib foo.dylib --name foo

Команды LLDB, представленные в этом разделе, с помощью поддающегося обнаружению названия команды и канонической формы опции, могут казаться несколько долгими. Однако так же, как в GDB, интерпретатор команд LLDB делает соответствие самой короткой уникальной строки на названиях команды, создавая сокращенную форму команды. Например, следующие два выражения командной строки демонстрируют ту же команду:

(lldb) breakpoint set --name "-[SKTGraphicView alignLeftEdges:]"
(lldb) br s --name "-[SKTGraphicView alignLeftEdges:]"

Точно так же можно объединить обе самых коротких уникальных строки, соответствующие с сокращенным форматом опции для сокращения нажатий клавиш. Используя два вместе может сократить выражения командной строки далее. Например:

(lldb) breakpoint set --shlib foo.dylib --name foo

становится:

(lldb) br s -s foo.dylib -n foo

Использование этих функций LLDB предлагает почти такое же 'краткое' чувство и краткость как тогда, когда с помощью GDB. Взгляд Устанавливает контрольные точки Команды и другие разделы в GDB и Примерах Команды LLDB для большего количества примеров того, как самая короткая уникальная строка, соответствующая и использующая опции сокращенной формы, может сохранить нажатия клавиш.

Сценарии с Python

Для опытных пользователей LLDB имеет встроенный интерпретатор Python, доступный при помощи script команда. Все функции отладчика доступны как классы в интерпретаторе Python. В результате более сложные команды, в GDB представленные с define команда может быть достигнута путем записи функций Python, пользующихся библиотекой LLDB-Python и затем загружающих сценарии в рабочий сеанс, получив доступ к ним с script команда. Для получения дополнительной информации о библиотеке LLDB-Python, посетите Ссылку Python LLDB и Python LLDB, Пишущий сценарий разделов В качестве примера веб-сайта Отладчика LLDB.

Псевдонимы команды и справка

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

Понимание псевдонимов команды

Используйте механизм псевдонима команды в LLDB для построения псевдонимов для обычно используемых команд. Например, если Вы неоднократно вводите:

(lldb) breakpoint set --file foo.c --line 12

можно создать псевдоним с:

(lldb) command alias bfl breakpoint set -f %1 -l %2

который позволяет Вам ввести эту команду как:

(lldb) bfl foo.c 12

Поскольку псевдонимы команды полезны в большом разнообразии ситуаций, необходимо познакомиться с их конструкцией. Для полного объяснения конструкции псевдонима команды ограничения и синтаксис, используют систему справочной информации LLDB. Введите:

(lldb) help command alias

Используя справку LLDB

Исследуйте систему справочной информации LLDB для получения более широкого понимания того, что LLDB должен предложить и посмотреть детали конструкций команды LLDB. Знакомиться с help команда предоставляет Вам доступ к обширной документации команды в системе справочной информации.

Простой вызов help команда возвращает список всех команд LLDB верхнего уровня. Например, вот частичное перечисление:

(lldb) help
The following is a list of built-in, permanent debugger commands:
 
_regexp-attach    -- Attach to a process id if in decimal, otherwise treat the
                     argument as a process name to attach to.
_regexp-break     -- Set a breakpoint using a regular expression to specify the
                     location, where <linenum> is in decimal and <address> is
                     in hex.
_regexp-bt        -- Show a backtrace.  An optional argument is accepted; if
                     that argument is a number, it specifies the number of
                     frames to display.  If that argument is 'all', full
                     backtraces of all threads are displayed.
 … and so forth …

Вызов help сопровождаемый любой из команд перечисляет запись справки для той команды и любых подкоманд, опций и параметров. Путем вызова help <command> <subcommand> [<subcommand>…] многократно по всем командам, Вы пересекаете всю иерархию команд LLDB.

help дисплей команды включает все текущие псевдонимы команды, когда вызвано с опцией --show-aliases (-a в краткой форме).

(lldb) help -a

Более направленный способ исследовать, что доступно в LLDB, состоит в том, чтобы использовать apropos команда: Это ищет документацию справки LLDB слово и выводит сводную строку справки для каждой команды соответствия. Например:

(lldb) apropos file
The following commands may relate to 'file':
log enable                     -- Enable logging for a single log channel.
memory read                    -- Read from the memory of the process being
                                  debugged.
memory write                   -- Write to the memory of the process being
                                  debugged.
platform process launch        -- Launch a new process on a remote platform.
platform select                -- Create a platform if needed and select it as
                                  the current platform.
plugin load                    -- Import a dylib that implements an LLDB
                                  plugin.
process launch                 -- Launch the executable in the debugger.
process load                   -- Load a shared library into the current
                                  process.
source                         -- A set of commands for accessing source file
                                  information
… and so forth …

Используйте help команда с командой искажает для понимания их конструкции. Например, введите следующую команду для наблюдения объяснения предоставленного GDB b эмуляция и ее реализация:

(lldb) help b
'b' is an abbreviation for '_regexp-break'

Другая функция help команда показана путем исследования команды break command add (используемый в Установке Точек останова). Для демонстрации его необходимо выполнить команду и исследовать результаты системы справочной информации:

(lldb) help break command add
Add a set of commands to a breakpoint, to be executed whenever the breakpoint is hit.
 
Syntax: breakpoint command add <cmd-options> <breakpt-id>
etc...

Параметры команде, указанные в выводе справки в угловых скобках (такой как <breakpt-id>), укажите, что параметром является общий тип аргумента, для которого дальнейшая справка доступна путем запросов системы команд. В этом случае, для узнавания больше <breakpt-id>, войдите:

(lldb) help <breakpt-id>
 
<breakpt-id> -- Breakpoint IDs consist major and minor numbers; the major
etc...

Используя help часто и исследование документации справки LLDB является отличным способом ознакомить себя с объемом возможностей LLDB.