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
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