GDB to LLDB command map
=======================

Below is a table of GDB commands with their LLDB counterparts. The built in
GDB-compatibility aliases in LLDB are also listed. The full lldb command names
are often long, but any unique short form can be used. Instead of "**breakpoint
set**", "**br se**" is also acceptable.

* `Execution Commands`_
* `Breakpoint Commands`_
* `Watchpoint Commands`_
* `Examining Variables`_
* `Evaluating Expressions`_
* `Examining Thread State`_
* `Executable and Shared Library Query Commands`_
* `Miscellaneous`_

Execution Commands
------------------

Launch a process no arguments
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) run
  (gdb) r

.. code-block:: shell

  (lldb) process launch
  (lldb) run
  (lldb) r

Launch a process with arguments ``<args>``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) run <args>
  (gdb) r <args>


.. code-block:: shell

  (lldb) process launch -- <args>
  (lldb) run <args>
  (lldb) r <args>

Launch process ``a.out`` with arguments ``1 2 3`` by passing the args to the debugger
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  % gdb --args a.out 1 2 3
  (gdb) run
  ...
  (gdb) run
  ...

.. code-block:: shell

  % lldb -- a.out 1 2 3
  (lldb) run
  ...
  (lldb) run
  ...


Launch process a.out with arguments ``1 2 3`` by setting the args in the debugger
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) set args 1 2 3
  (gdb) run
  ...
  (gdb) run
  ...

.. code-block:: shell

  (lldb) settings set target.run-args 1 2 3
  (lldb) run
  ...
  (lldb) run
  ...

Launch a process with arguments in new terminal window (macOS only)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) process launch --tty -- <args>
  (lldb) pro la -t -- <args>

Launch a process with arguments ``<args>`` in existing terminal ``/dev/ttys006``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

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


Set environment variables for process before launching
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) set env DEBUG 1

.. code-block:: shell

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


Unset environment variables for process before launching
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) unset env DEBUG

.. code-block:: shell

  (lldb) settings remove target.env-vars DEBUG
  (lldb) set rem target.env-vars DEBUG

Show the arguments that will be or were passed to the program when run
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) show args
  Argument list to give program being debugged when it is started is "1 2 3".

.. code-block:: shell

  (lldb) settings show target.run-args
  target.run-args (array of strings) =
  [0]: "1"
  [1]: "2"
  [2]: "3"

Set environment variables for process and launch process in one command
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) process launch -E DEBUG=1

Attach to the process with process ID 123
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) attach 123

.. code-block:: shell

  (lldb) process attach --pid 123
  (lldb) attach -p 123

Attach to the process named ``a.out``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) attach a.out

.. code-block:: shell

  (lldb) process attach --name a.out
  (lldb) pro at -n a.out

Wait for a process named ``a.out`` to launch and attach
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) attach -waitfor a.out

.. code-block:: shell

  (lldb) process attach --name a.out --waitfor
  (lldb) pro at -n a.out -w

Attach to a remote gdb protocol server running on system ``eorgadd``, port ``8000``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) target remote eorgadd:8000

.. code-block:: shell

  (lldb) gdb-remote eorgadd:8000

Attach to a remote gdb protocol server running on the local system, port ``8000``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) target remote localhost:8000

.. code-block:: shell

  (lldb) gdb-remote 8000

Attach to a Darwin kernel in kdp mode on system ``eorgadd``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) kdp-reattach eorgadd

.. code-block:: shell

  (lldb) kdp-remote eorgadd

Do a source level single step in the currently selected thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) step
  (gdb) s

.. code-block:: shell

  (lldb) thread step-in
  (lldb) step
  (lldb) s

Ignore a function when doing a source level single step in
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) skip abc
  Function abc will be skipped when stepping.

.. code-block:: shell

  (lldb) settings show target.process.thread.step-avoid-regexp
  target.process.thread.step-avoid-regexp (regex) = ^std::
  (lldb) settings set target.process.thread.step-avoid-regexp ^std::|^abc

You can ignore a function once using:

.. code-block:: shell

  (lldb) thread step-in -r ^abc

Or you can do the opposite, only step into functions matching a certain name:

.. code-block:: shell

  # Step in if abc is a substring of the function name.
  (lldb) sif abc
  # Which is equivalent to:
  (lldb) thread step-in -t abc

``thread step-in`` has more options which cover some of ``skip``'s other
features. See ``help thread step-in`` for details.

Do a source level single step over in the currently selected thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) next
  (gdb) n

.. code-block:: shell

  (lldb) thread step-over
  (lldb) next
  (lldb) n

Do an instruction level single step in the currently selected thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) stepi
  (gdb) si

.. code-block:: shell

  (lldb) thread step-inst
  (lldb) si

Do an instruction level single step over in the currently selected thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) nexti
  (gdb) ni

.. code-block:: shell

  (lldb) thread step-inst-over
  (lldb) ni

Step out of the currently selected frame
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) finish

.. code-block:: shell

  (lldb) thread step-out
  (lldb) finish

Return immediately from the currently selected frame, with an optional return value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) return <RETURN EXPRESSION>

.. code-block:: shell

  (lldb) thread return <RETURN EXPRESSION>

Backtrace and disassemble every time you stop
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) target stop-hook add
  Enter your stop hook command(s). Type 'DONE' to end.
  > bt
  > disassemble --pc
  > DONE
  Stop hook #1 added.

Run until we hit line 12 or control leaves the current function
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) until 12

.. code-block:: shell

  (lldb) thread until 12

Show the current frame and source line
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) frame

.. code-block:: shell

  (lldb) frame select
  (lldb) f
  (lldb) process status

Breakpoint Commands
-------------------

Set a breakpoint at all functions named main
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) break main

.. code-block:: shell

  (lldb) breakpoint set --name main
  (lldb) br s -n main
  (lldb) b main

Set a breakpoint in file ``test.c`` at line ``12``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) break test.c:12

.. code-block:: shell

  (lldb) breakpoint set --file test.c --line 12
  (lldb) br s -f test.c -l 12
  (lldb) b test.c:12

Set a breakpoint at all C++ methods whose basename is ``main``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) break main
  (Hope that there are no C functions named main)

.. code-block:: shell

  (lldb) breakpoint set --method main
  (lldb) br s -M main

Set a breakpoint at an Objective-C function ``-[NSString stringWithFormat:]``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) break -[NSString stringWithFormat:]

.. code-block:: shell

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

Set a breakpoint at all Objective-C methods whose selector is ``count``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) break count
  (Hope that there are no C or C++ functions named count)

.. code-block:: shell

  (lldb) breakpoint set --selector count
  (lldb) br s -S count

Set a breakpoint by regular expression on function name
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) rbreak regular-expression

.. code-block:: shell

  (lldb) breakpoint set --func-regex regular-expression
  (lldb) br s -r regular-expression

Ensure that breakpoints by file and line work for ``#include .c/.cpp/.m`` files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) b foo.c:12

.. code-block:: shell

  (lldb) settings set target.inline-breakpoint-strategy always
  (lldb) br s -f foo.c -l 12

Set a breakpoint by regular expression on source file contents
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) shell grep -e -n pattern source-file
  (gdb) break source-file:CopyLineNumbers

.. code-block:: shell

  (lldb) breakpoint set --source-pattern regular-expression --file SourceFile
  (lldb) br s -p regular-expression -f file

Set a conditional breakpoint
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) break foo if strcmp(y,"hello") == 0

.. code-block:: shell

  (lldb) breakpoint set --name foo --condition '(int)strcmp(y,"hello") == 0'
  (lldb) br s -n foo -c '(int)strcmp(y,"hello") == 0'

List all breakpoints
~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info break

.. code-block:: shell

  (lldb) breakpoint list
  (lldb) br l

Delete a breakpoint
~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) delete 1

.. code-block:: shell

  (lldb) breakpoint delete 1
  (lldb) br del 1

Disable a breakpoint
~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) disable 1

.. code-block:: shell

  (lldb) breakpoint disable 1
  (lldb) br dis 1

Enable a breakpoint
~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) enable 1

.. code-block:: shell

  (lldb) breakpoint enable 1
  (lldb) br en 1


Watchpoint Commands
-------------------

Set a watchpoint on a variable when it is written to
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: shell

  (gdb) watch global_var

.. code-block:: shell

  (lldb) watchpoint set variable global_var
  (lldb) wa s v global_var

Set a watchpoint on a memory location when it is written into
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The size of the region to watch for defaults to the pointer size if no '-x byte_size' is specified. This command takes raw input, evaluated as an expression returning an unsigned integer pointing to the start of the region, after the '--' option terminator.

.. code-block:: shell

  (gdb) watch -location g_char_ptr

.. code-block:: shell

  (lldb) watchpoint set expression -- my_ptr
  (lldb) wa s e -- my_ptr

Set a condition on a watchpoint
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (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
  (lldb) frame var global
  (int32_t) global = 5

List all watchpoints
~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info break

.. code-block:: shell

  (lldb) watchpoint list
  (lldb) watch l

Delete a watchpoint
~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) delete 1

.. code-block:: shell

  (lldb) watchpoint delete 1
  (lldb) watch del 1


Examining Variables
-------------------

Show the arguments and local variables for the current frame
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info args
  (gdb) info locals

.. code-block:: shell

  (lldb) frame variable
  (lldb) fr v

Show the local variables for the current frame
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info locals

.. code-block:: shell

  (lldb) frame variable --no-args
  (lldb) fr v -a

Show the contents of local variable ``bar``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) p bar

.. code-block:: shell

  (lldb) frame variable bar
  (lldb) fr v bar
  (lldb) p bar

Show the contents of local variable ``bar`` formatted as hex
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) p/x bar

.. code-block:: shell

  (lldb) frame variable --format x bar
  (lldb) fr v -f x bar

Show the contents of global variable ``baz``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) p baz

.. code-block:: shell

  (lldb) target variable baz
  (lldb) ta v baz

Show the global/static variables defined in the current source file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) target variable
  (lldb) ta v

Display the variables ``argc`` and ``argv`` every time you stop
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) display argc
  (gdb) display argv

.. code-block:: shell

  (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

Display the variables ``argc`` and ``argv`` only when you stop in the function named ``main``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) target stop-hook add --name main --one-liner "frame variable argc argv"
  (lldb) ta st a -n main -o "fr v argc argv"

Display the variable ``*this`` only when you stop in c class named ``MyClass``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) target stop-hook add --classname MyClass --one-liner "frame variable *this"
  (lldb) ta st a -c MyClass -o "fr v *this"

Print an array of integers in memory, assuming we have a pointer like ``int *ptr``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) p *ptr@10

.. code-block:: shell

  (lldb) parray 10 ptr

Evaluating Expressions
----------------------

Evaluating a generalized expression in the current frame
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

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

or if you don't want to see void returns:

.. code-block:: shell

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

.. code-block:: shell

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

or using the print alias:

.. code-block:: shell

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

Creating and assigning a value to a convenience variable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) set $foo = 5
  (gdb) set variable $foo = 5

or using the print command

.. code-block:: shell

  (gdb) print $foo = 5

or using the call command

.. code-block:: shell

  (gdb) call $foo = 5

and if you want to specify the type of the variable:

.. code-block:: shell

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

In lldb you evaluate a variable declaration expression as you would write it in C:

.. code-block:: shell

  (lldb) expr unsigned int $foo = 5

Printing the ObjC "description" of an object
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) po [SomeClass returnAnObject]

.. code-block:: shell

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

or using the po alias:

.. code-block:: shell

  (lldb) po [SomeClass returnAnObject]

Print the dynamic type of the result of an expression
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) set print object 1
  (gdb) p someCPPObjectPtrOrReference
  (Only works for C++ objects)

.. code-block:: shell

  (lldb) expr -d 1 -- [SomeClass returnAnObject]
  (lldb) expr -d 1 -- someCPPObjectPtrOrReference

or set dynamic type printing to be the default:

.. code-block:: shell

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

Call a function so you can stop at a breakpoint in it
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) set unwindonsignal 0
  (gdb) p function_with_a_breakpoint()

.. code-block:: shell

  (lldb) expr -i 0 -- function_with_a_breakpoint()

Call a function that crashes, then stop when it does
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) set unwindonsignal 0
  (gdb) p function_which_crashes()

.. code-block:: shell

  (lldb) expr -u 0 -- function_which_crashes()

Examining Thread State
----------------------

List the threads in your program
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info threads

.. code-block:: shell

  (lldb) thread list

Select thread ``1`` as the default thread for subsequent commands
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) thread 1

.. code-block:: shell

  (lldb) thread select 1
  (lldb) t 1

Show the stack backtrace for the current thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) bt

.. code-block:: shell

  (lldb) thread backtrace
  (lldb) bt

Show the stack backtraces for all threads
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) thread apply all bt

.. code-block:: shell

  (lldb) thread backtrace all
  (lldb) bt all

Backtrace the first five frames of the current thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) bt 5

.. code-block:: shell

  (lldb) thread backtrace -c 5
  (lldb) bt 5

Select a different stack frame by index for the current thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) frame 12

.. code-block:: shell

  (lldb) frame select 12
  (lldb) fr s 12
  (lldb) f 12

List information about the currently selected frame in the current thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) frame info

Select the stack frame that called the current stack frame
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) up

.. code-block:: shell

  (lldb) up
  (lldb) frame select --relative=1

Select the stack frame that is called by the current stack frame
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) down

.. code-block:: shell

  (lldb) down
  (lldb) frame select --relative=-1
  (lldb) fr s -r-1

Select a different stack frame using a relative offset
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) up 2
  (gdb) down 3

.. code-block:: shell

  (lldb) frame select --relative 2
  (lldb) fr s -r2

  (lldb) frame select --relative -3
  (lldb) fr s -r-3

show the general purpose registers for the current thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info registers

.. code-block:: shell

  (lldb) register read

Write a new decimal value ``123`` to the current thread register ``rax``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) p $rax = 123

.. code-block:: shell

  (lldb) register write rax 123

Skip 8 bytes ahead of the current program counter (instruction pointer)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Note that we use backticks to evaluate an expression and insert the scalar result in LLDB.


.. code-block:: shell

  (gdb) jump *$pc+8

.. code-block:: shell

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

Show the general purpose registers for the current thread formatted as signed decimal
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

LLDB tries to use the same format characters as printf(3) when possible. Type "help format" to see the full list of format specifiers.

.. code-block:: shell

  (lldb) register read --format i
  (lldb) re r -f i

LLDB now supports the GDB shorthand format syntax but there can't be space after the command:

.. code-block:: shell

  (lldb) register read/d

Show all registers in all register sets for the current thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info all-registers

.. code-block:: shell

  (lldb) register read --all
  (lldb) re r -a

Show the values for the registers named ``rax``, ``rsp`` and ``rbp`` in the current thread
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info all-registers rax rsp rbp

.. code-block:: shell

  (lldb) register read rax rsp rbp

Show the values for the register named ``rax`` in the current thread formatted as binary
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) p/t $rax

.. code-block:: shell

  (lldb) register read --format binary rax
  (lldb) re r -f b rax

LLDB now supports the GDB shorthand format syntax but there can't be space after the command

.. code-block:: shell

  (lldb) register read/t rax
  (lldb) p/t $rax

Read memory from address ``0xbffff3c0`` and show 4 hex ``uint32_t`` values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) x/4xw 0xbffff3c0

.. code-block:: shell

  (lldb) memory read --size 4 --format x --count 4 0xbffff3c0
  (lldb) me r -s4 -fx -c4 0xbffff3c0
  (lldb) x -s4 -fx -c4 0xbffff3c0

LLDB now supports the GDB shorthand format syntax but there can't be space after the command:

.. code-block:: shell

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

Read memory starting at the expression ``argv[0]``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) x argv[0]

.. code-block:: shell

  (lldb) memory read `argv[0]`

NOTE: any command can inline a scalar expression result (as long as the target is stopped) using backticks around any expression:

.. code-block:: shell

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

Read ``512`` bytes of memory from address ``0xbffff3c0`` and save the results to a local file as text
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) set logging on
  (gdb) set logging file /tmp/mem.txt
  (gdb) x/512bx 0xbffff3c0
  (gdb) set logging off

.. code-block:: shell

  (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

Save binary memory data starting at ``0x1000`` and ending at ``0x2000`` to a file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

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

.. code-block:: shell

  (lldb) memory read --outfile /tmp/mem.bin --binary 0x1000 0x2000
  (lldb) me r -o /tmp/mem.bin -b 0x1000 0x2000

Get information about a specific heap allocation (macOS only)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info malloc 0x10010d680

.. code-block:: shell

  (lldb) command script import lldb.macosx.heap
  (lldb) process launch --environment MallocStackLogging=1 -- [ARGS]
  (lldb) malloc_info --stack-history 0x10010d680

Get information about a specific heap allocation and cast the result to any dynamic type that can be deduced (macOS only)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) command script import lldb.macosx.heap
  (lldb) malloc_info --type 0x10010d680

Find all heap blocks that contain a pointer specified by an expression ``EXPR`` (macOS only)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) command script import lldb.macosx.heap
  (lldb) ptr_refs EXPR

Find all heap blocks that contain a C string anywhere in the block (macOS only)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) command script import lldb.macosx.heap
  (lldb) cstr_refs CSTRING

Disassemble the current function for the current frame
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) disassemble

.. code-block:: shell

  (lldb) disassemble --frame
  (lldb) di -f

Disassemble any functions named main
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) disassemble main


.. code-block:: shell

  (lldb) disassemble --name main
  (lldb) di -n main

Disassemble an address range
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) disassemble 0x1eb8 0x1ec3

.. code-block:: shell

  (lldb) disassemble --start-address 0x1eb8 --end-address 0x1ec3
  (lldb) di -s 0x1eb8 -e 0x1ec3

Disassemble ``20`` instructions from a given address
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) x/20i 0x1eb8

.. code-block:: shell

  (lldb) disassemble --start-address 0x1eb8 --count 20
  (lldb) di -s 0x1eb8 -c 20

Show mixed source and disassembly for the current function for the current frame
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) disassemble --frame --mixed
  (lldb) di -f -m

Disassemble the current function for the current frame and show the opcode bytes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) disassemble --frame --bytes
  (lldb) di -f -b

Disassemble the current source line for the current frame
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) disassemble --line
  (lldb) di -l

Executable and Shared Library Query Commands
--------------------------------------------

List the main executable and all dependent shared libraries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info shared

.. code-block:: shell

  (lldb) image list

Look up information for a raw address in the executable or any shared libraries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info symbol 0x1ec4

.. code-block:: shell

  (lldb) image lookup --address 0x1ec4
  (lldb) im loo -a 0x1ec4

Look up functions matching a regular expression in a binary
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info function <FUNC_REGEX>

This one finds debug symbols:

.. code-block:: shell

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

This one finds non-debug symbols:

.. code-block:: shell

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

Provide a list of binaries as arguments to limit the search.

Find full source line information
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) info line 0x1ec4

This one is a bit messy at present. Do:

.. code-block:: shell

  (lldb) image lookup -v --address 0x1ec4

and look for the LineEntry line, which will have the full source path and line range information.

Look up information for an address in ``a.out`` only
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

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

Look up information for for a type ``Point`` by name
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) ptype Point

.. code-block:: shell

  (lldb) image lookup --type Point
  (lldb) im loo -t Point

Dump all sections from the main executable and any shared libraries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) maintenance info sections

.. code-block:: shell

  (lldb) image dump sections

Dump all sections in the ``a.out`` module
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) image dump sections a.out

Dump all symbols from the main executable and any shared libraries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (lldb) image dump symtab

Dump all symbols in ``a.out`` and ``liba.so``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

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

Miscellaneous
-------------

Search command help for a keyword
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) apropos keyword

.. code-block:: shell

  (lldb) apropos keyword

Echo text to the screen
~~~~~~~~~~~~~~~~~~~~~~~

.. code-block:: shell

  (gdb) echo Here is some text\n

.. code-block:: shell

  (lldb) script print "Here is some text"

Remap source file pathnames for the debug session
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If your source files are no longer located in the same location as when the
program was built (for example, if the program was built on a different
computer) you need to tell the debugger how to find the sources at their local
file path instead of the build system's file path.

.. code-block:: shell

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

.. code-block:: shell

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

Supply a catchall directory to search for source files in.

.. code-block:: shell

  (gdb) directory /my/path
