1359 lines
30 KiB
ReStructuredText
1359 lines
30 KiB
ReStructuredText
|
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
|