GDB и примеры команды LLDB

Таблицы в этой главе приводят обычно используемые команды GDB и представляют эквивалентные команды LLDB и альтернативные формы. Также перечисленный встроенные псевдонимы совместимости GDB в LLDB.

Заметьте, что полные названия команды LLDB могут быть соответствующими уникальными краткими формами, которые могут использоваться вместо этого. Например, вместо breakpoint set, br se может использоваться.

Команды выполнения

GDB

LLDB

Запустите процесс без параметров.

(gdb) run

(gdb) r

(lldb) process launch

(lldb) run

(lldb) r

Запустите процесс с параметрами <args>.

(gdb) run <args>

(gdb) r <args>

(lldb) process launch -- <args>

(lldb) r <args>

Процесс запуска a.out с параметрами 1 2 3, не имея необходимость предоставлять args каждый раз.

% gdb --args a.out 1 2 3

(gdb) run

...

(gdb) run

...

(% lldb -- a.out 1 2 3

(lldb) run

...

(lldb) run

...

Запустите процесс с параметрами в новом окне терминала (только OS X).

 —

(lldb) process launch --tty -- <args>

(lldb) pro la -t -- <args>

Запустите процесс с параметрами в существующем Окне терминала, /dev/ttys006 (Только OS X).

 —

(lldb) process launch --tty=/dev/ttys006 -- <args>

(lldb) pro la -t/dev/ttys006 -- <args>

Установите переменные окружения для процесса перед запуском.

(gdb) set env DEBUG 1

(lldb) settings set target.env-vars DEBUG=1

(lldb) set se target.env-vars DEBUG=1

Установите переменные окружения для процесса и процесса запуска в одной команде.

 

(lldb) process launch -v DEBUG=1

Присоедините к процессу с ID 123 процесса.

(gdb) attach 123

(lldb) process attach --pid 123

(lldb) attach -p 123

Присоедините к названному процессу a.out.

(gdb) attach a.out

(lldb) process attach --name a.out

(lldb) pro at -n a.out

Ожидайте названного процесса a.out запустить и присоединить.

(gdb) attach -waitfor a.out

(lldb) process attach --name a.out --waitfor

(lldb) pro at -n a.out -w

Присоедините к удаленному серверу протокола GDB, работающему на системе eorgadd, порт 8000.

(gdb) target remote eorgadd:8000

(lldb) gdb-remote eorgadd:8000

Присоедините к удаленному серверу протокола GDB, работающему на локальной системе, порт 8000.

(gdb) target remote localhost:8000

(lldb) gdb-remote 8000

Присоедините к Дарвинскому ядру в kdp режиме в системе eorgadd.

(gdb) kdp-reattach eorgadd

(lldb) kdp-remote eorgadd

Сделайте исходный уровень единственный шаг в в настоящее время выбираемом потоке.

(gdb) step

(gdb) s

(lldb) thread step-in

(lldb) step

(lldb) s

Сделайте исходный уровень единственный шаг в в настоящее время выбираемом потоке.

(gdb) next

(gdb) n

(lldb) thread step-over

(lldb) next

(lldb) n

Сделайте уровень инструкции единственный шаг в в настоящее время выбираемом потоке.

(gdb) stepi

(gdb) si

(lldb) thread step-inst

(lldb) si

Сделайте уровень инструкции единственный шаг в в настоящее время выбираемом потоке.

(gdb) nexti

(gdb) ni

(lldb) thread step-inst-over

(lldb) ni

Шаг из в настоящее время выбранного кадра.

(gdb) finish

(lldb) thread step-out

(lldb) finish

След и демонтирует каждый раз, когда Вы останавливаетесь.

 —

(lldb) target stop-hook add

Enter your stop hook command(s). Type 'DONE' to end.

> bt

> disassemble --pc

> DONE

Stop hook #1 added.

Команды точки останова

GDB

LLDB

Установите точку останова во всех названных функциях main.

(gdb) break main

(lldb) breakpoint set --name main

(lldb) br s -n main

(lldb) b main

Установите точку останова в файле test.c в строке 12.

(gdb) break test.c:12

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

(lldb) br s -f test.c -l 12

(lldb) b test.c:12

Установите точку останова во всех методах C++, базовое имя которых main.

(gdb) break main

(Примечание: Это повредится на любых названных функциях C main.)

(lldb) breakpoint set --method main

(lldb) br s -M main

Установите точку останова в функции Objective C: -[NSString stringWithFormat:].

(gdb) break -[NSString stringWithFormat:]

(lldb) breakpoint set --name "-[NSString stringWithFormat:]"

(lldb) b -[NSString stringWithFormat:]

Установите точку останова во всех методах Objective C, селектор которых count.

(gdb) break count

(Примечание: Это повредится на любом C или названных функциях C++ count.)

(lldb) breakpoint set --selector count

(lldb) br s -S count

Установите точку останова регулярным выражением на имени функции.

(gdb) rbreak regular-expression

(lldb) breakpoint set --regex regular-expression

(lldb) br s -r regular-expression

Установите точку останова регулярным выражением на содержании исходного файла.

(gdb) shell grep -e -n pattern source-file

(gdb) break source-file:CopyLineNumbers

(lldb) breakpoint set --source-pattern regular-expression --file SourceFile

(lldb) br s -p regular-expression -f file

Перечислите все точки останова.

(gdb) info break

(lldb) breakpoint list

(lldb) br l

Удалите точку останова.

(gdb) delete 1

(lldb) breakpoint delete 1

(lldb) br del 1

Команды контрольной точки

GDB

LLDB

Установите контрольную точку на переменной, когда это будет записано в.

(gdb) watch global_var

(lldb) watchpoint set variable global_var

(lldb) wa s v global_var

Установите контрольную точку на ячейке памяти, когда это будет записано в.

(gdb) watch -location g_char_ptr

(lldb) watchpoint set expression -- my_ptr

(lldb) wa s e -- my_ptr

 

Примечание: Размер области для наблюдения за значениями по умолчанию к размеру указателя, если нет -x byte_size указан. Эта команда берет «необработанный» ввод, оцененный как выражение, возвращая целое без знака, указывающее на запуск области, после разделителя опции (--).

Установите условие на контрольной точке.

 —

(lldb) watch set var global

(lldb) watchpoint modify -c '(global==5)'

(lldb) c

...

(lldb) bt

* thread #1: tid = 0x1c03, 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16, stop reason = watchpoint 1

frame #0: 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16

frame #1: 0x0000000100000eac a.out`main + 108 at main.cpp:25

frame #2: 0x00007fff8ac9c7e1 libdyld.dylib`start + 1

(int32_t) global = 5

Перечислите все контрольные точки.

(gdb) info break

(lldb) watchpoint list

(lldb) watch l

Удалите контрольную точку.

(gdb) delete 1

(lldb) watchpoint delete 1

(lldb) watch del 1

Исследование переменных

GDB

LLDB

Покажите параметры и локальные переменные для текущего кадра.

(gdb) info args

и

(gdb) info locals

(lldb) frame variable

(lldb) fr v

Покажите локальные переменные для текущего кадра.

(gdb) info locals

(lldb) frame variable --no-args

(lldb) fr v -a

Покажите содержание локальной переменной bar.

(gdb) p bar

(lldb) frame variable bar

(lldb) fr v bar

(lldb) p bar

Покажите содержание локальной переменной bar отформатированный как шестнадцатеричное число.

(gdb) p/x bar

(lldb) frame variable --format x bar

(lldb) fr v -f x bar

Покажите содержание глобальной переменной baz.

(gdb) p baz

(lldb) target variable baz

(lldb) ta v baz

Покажите глобальную переменную/статические переменные, определенную в текущем исходном файле.

 —

(lldb) target variable

(lldb) ta v

Выведите на экран переменные argc и argv каждый раз Вы останавливаетесь.

(gdb) display argc

(gdb) display argv

(lldb) target stop-hook add --one-liner "frame variable argc argv"

(lldb) ta st a -o "fr v argc argv"

(lldb) display argc

(lldb) display argv

Выведите на экран переменные argc и argv только, когда Вы останавливаетесь в названной функции main.

 —

 

(lldb) target stop-hook add --name main --one-liner "frame variable argc argv"

(lldb) ta st a -n main -o "fr v argc argv"

Выведите на экран переменную *this только, когда Вы останавливаетесь в названном классе C MyClass.

 —

 

(lldb) target stop-hook add --classname MyClass --one-liner "frame variable *this"

(lldb) ta st a -c MyClass -o "fr v *this"

Оценка выражений

GDB

LLDB

Оцените обобщенное выражение в текущем кадре.

(gdb) print (int) printf ("Print nine: %d.", 4 + 5)

 

Или если Вы не хотите видеть недействительные возвраты:

(gdb) call (int) printf ("Print nine: %d.", 4 + 5)

(lldb) expr (int) printf ("Print nine: %d.", 4 + 5)

 

Или используйте print псевдоним:

(lldb) print (int) printf ("Print nine: %d.", 4 + 5)

Создайте и присвойте значение переменной удобства.

(gdb) set $foo = 5

(gdb) set variable $foo = 5

 

Или используйте print команда:

(gdb) print $foo = 5

 

Или используйте call команда:

(gdb) call $foo = 5

 

Указать тип переменной:

(gdb) set $foo = (unsigned int) 5

LLDB оценивает выражение объявления переменной, поскольку Вы записали бы его в C:

(lldb) expr unsigned int $foo = 5

Распечатайте Objective C description из объекта.

(gdb) po [SomeClass returnAnObject]

(lldb) expr -O -- [SomeClass returnAnObject]

 

Или используйте po псевдоним:

(lldb) po [SomeClass returnAnObject]

Распечатайте динамический тип результата выражения.

(gdb) set print object 1

(gdb) p someCPPObjectPtrOrReference

 

Примечание: Только для объектов C++.

(lldb) expr -d run-target -- [SomeClass returnAnObject]

(lldb) expr -d run-target -- someCPPObjectPtrOrReference

 

Или набор динамический тип, распечатывающий как значение по умолчанию:

(lldb) settings set target.prefer-dynamic run-target

Вызовите функцию для остановки в точке останова в функции.

(gdb) set unwindonsignal 0

(gdb) p function_with_a_breakpoint()

(lldb) expr -u 0 -- function_with_a_breakpoint()

Исследование состояния потока

GDB

LLDB

Покажите след штабеля для текущего потока.

(gdb) bt

(lldb) thread backtrace

(lldb) bt

Покажите следы штабеля для всех потоков.

(gdb) thread apply all bt

(lldb) thread backtrace all

(lldb) bt all

След первые пять кадров текущего потока.

(gdb) bt 5

(lldb) thread backtrace -c 5

(lldb) bt 5 (lldb-169 and later)

(lldb) bt -c 5 (lldb-168 and earlier)

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

(gdb) frame 12

(lldb) frame select 12

(lldb) fr s 12

(lldb) f 12

Информация о списке о в настоящее время выбранном кадре в текущем потоке.

 —

(lldb) frame info

Выберите стековый фрейм который названный текущим стековым фреймом.

(gdb) up

(lldb) up

(lldb) frame select --relative=1

Выберите стековый фрейм, который вызывает текущий стековый фрейм.

(gdb) down

(lldb) down

(lldb) frame select --relative=-1

(lldb) fr s -r-1

Выберите различный стековый фрейм с помощью относительного смещения.

(gdb) up 2

(gdb) down 3

(lldb) frame select --relative 2

(lldb) fr s -r2

 

(lldb) frame select --relative -3

(lldb) fr s -r-3

Покажите регистры общего назначения для текущего потока.

(gdb) info registers

(lldb) register read

Запишите новое десятичное значение 123 к регистру текущего потока rax.

(gdb) p $rax = 123

(lldb) register write rax 123

Пропустите 8 байтов перед текущим счетчиком команд (указатель команд).

(gdb) jump *$pc+8

(lldb) register write pc `$pc+8`

 

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

Покажите регистры общего назначения для текущего потока, отформатированного как подписанное десятичное число.

 —

(lldb) register read --format i

(lldb) re r -f i

 

LLDB теперь поддерживает краткий синтаксис формата GDB, но никакое пространство не разрешено после команды:

(lldb) register read/d

 

Примечание: LLDB пытается использовать те же символы формата как printf(3) если это возможно. Ввести help format видеть полный список спецификаторов формата.

Покажите все регистры во всех наборах регистров для текущего потока.

(gdb) info all-registers

(lldb) register read --all

(lldb) re r -a

Покажите значения для названных регистров rax, rsp и rbp в текущем потоке.

(gdb) info all-registers rax rsp rbp

(lldb) register read rax rsp rbp

Покажите значения для названного регистра rax в текущем потоке, отформатированном как двоичный файл.

(gdb) p/t $rax

(lldb) register read --format binary rax

(lldb) re r -f b rax

 

LLDB теперь поддерживает краткий синтаксис формата GDB, но никакое пространство не разрешено после команды:

(lldb) register read/t rax

(lldb) p/t $rax

Считайте память из адреса 0xbffff3c0 и покажите четырем шестнадцатеричным числам uint32_t значения.

(gdb) x/4xw 0xbffff3c0

(lldb) memory read --size 4 --format x --count 4 0xbffff3c0

(lldb) me r -s4 -fx -c4 0xbffff3c0

(lldb) x -s4 -fx -c4 0xbffff3c0

 

LLDB теперь поддерживает краткий синтаксис формата GDB, но никакое пространство не разрешено после команды:

(lldb) memory read/4xw 0xbffff3c0

(lldb) x/4xw 0xbffff3c0

(lldb) memory read --gdb-format 4xw 0xbffff3c0

Считайте память, запускающуюся в выражении argv[0].

(gdb) x argv[0]

(lldb) memory read `argv[0]`

 

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

(lldb) memory read --size `sizeof(int)` `argv[0]`

Считайте 512 байтов памяти от адреса 0xbffff3c0 и сохраните результаты к локальному файлу как текст.

(gdb) set logging on

(gdb) set logging file /tmp/mem.txt

(gdb) x/512bx 0xbffff3c0

(gdb) set logging off

(lldb) memory read --outfile /tmp/mem.txt --count 512 0xbffff3c0

(lldb) me r -o/tmp/mem.txt -c512 0xbffff3c0

(lldb) x/512bx -o/tmp/mem.txt 0xbffff3c0

Сохраните двоичные данные памяти к файлу, запускающемуся в 0x1000 и окончание в 0x2000.

(gdb) dump memory /tmp/mem.bin 0x1000 0x2000

(lldb) memory read --outfile /tmp/mem.bin --binary 0x1000 0x1200

(lldb) me r -o /tmp/mem.bin -b 0x1000 0x1200

Демонтируйте текущую функцию для текущего кадра.

(gdb) disassemble

(lldb) disassemble --frame

(lldb) di -f

Демонтируйте любые названные функции main.

(gdb) disassemble main

(lldb) disassemble --name main

(lldb) di -n main

Демонтируйте диапазон адресов.

(gdb) disassemble 0x1eb8 0x1ec3

(lldb) disassemble --start-address 0x1eb8 --end-address 0x1ec3

(lldb) di -s 0x1eb8 -e 0x1ec3

Демонтируйте 20 инструкций от данного адреса.

(gdb) x/20i 0x1eb8

(lldb) disassemble --start-address 0x1eb8 --count 20

(lldb) di -s 0x1eb8 -c 20

Покажите смешанный источник и дизассемблирование для текущей функции для текущего кадра.

 —

(lldb) disassemble --frame --mixed

(lldb) di -f -m

Демонтируйте текущую функцию для текущего кадра и покажите байты кода операции.

 —

(lldb) disassemble --frame --bytes

(lldb) di -f -b

Демонтируйте текущую исходную строку для текущего кадра.

 —

(lldb) disassemble --line

(lldb) di -l

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

GDB

LLDB

Перечислите основную исполнимую программу, и весь зависимый совместно использовал библиотеки.

(gdb) info shared

(lldb) image list

Ищите информацию для необработанного адреса в исполнимой программе или любых совместно используемых библиотек.

(gdb) info symbol 0x1ec4

(lldb) image lookup --address 0x1ec4

(lldb) im loo -a 0x1ec4

Ищите функции, соответствующие регулярное выражение в двоичном файле.

(gdb) info function <FUNC_REGEX>

Этот находит отладочные символы:

(lldb) image lookup -r -n <FUNC_REGEX>

 

Этот находит неотладочные символы:

(lldb) image lookup -r -s <FUNC_REGEX>

 

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

Ищите информацию для адреса в a.out только.

 —

(lldb) image lookup --address 0x1ec4 a.out

(lldb) im loo -a 0x1ec4 a.out

Ищите информацию для типа Point по имени.

(gdb) ptype Point

(lldb) image lookup --type Point

(lldb) im loo -t Point

Выведите все разделы от основной исполнимой программы и любых совместно используемых библиотек.

(gdb) maintenance info sections

(lldb) image dump sections

Выведите все разделы в a.out модуль.

 —

(lldb) image dump sections a.out

Выведите все символы от основной исполнимой программы и любых совместно используемых библиотек.

 —

(lldb) image dump symtab

Выведите все символы в a.out и liba.so.

 —

(lldb) image dump symtab a.out liba.so

Прочие условия

GDB

LLDB

Текст эха на экран.

(gdb) echo Here is some text\n

(lldb) script print "Here is some text"

Повторно отобразите пути исходного файла для сеанса отладки.

(gdb) set pathname-substitutions /buildbot/path /my/path

(lldb) settings set target.source-map /buildbot/path /my/path

 

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

Предоставьте всеобъемлющий каталог для поиска исходных файлов в.

(gdb) directory /my/path

(Никакая эквивалентная команда все же.)