forked from OSchip/llvm-project
1826 lines
58 KiB
ReStructuredText
1826 lines
58 KiB
ReStructuredText
GDB to LLDB command map
|
|
=======================
|
|
|
|
Below is a table of GDB commands with the 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.
|
|
|
|
.. contents::
|
|
:local:
|
|
|
|
Execution Commands
|
|
------------------
|
|
|
|
.. raw:: html
|
|
|
|
<table class="mapping" cellspacing="0">
|
|
<tbody>
|
|
<tr>
|
|
<td class="hed" width="50%">GDB</td>
|
|
<td class="hed" width="50%">LLDB</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Launch a process no arguments.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> run
|
|
<br>
|
|
<b>(gdb)</b> r
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> process launch
|
|
<br>
|
|
<b>(lldb)</b> run
|
|
<br>
|
|
<b>(lldb)</b> r
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Launch a process with arguments <code><args></code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> run <args>
|
|
<br>
|
|
<b>(gdb)</b> r <args>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> process launch -- <args>
|
|
<br>
|
|
<b>(lldb)</b> run <args>
|
|
<br>
|
|
<b>(lldb)</b> r <args>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Launch a process for with arguments <b><code>a.out 1 2 3</code></b> without having to supply the args every time.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>%</b> gdb --args a.out 1 2 3
|
|
<br>
|
|
<b>(gdb)</b> run
|
|
<br> ...
|
|
<br>
|
|
<b>(gdb)</b> run
|
|
<br> ...
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>%</b> lldb -- a.out 1 2 3
|
|
<br>
|
|
<b>(lldb)</b> run
|
|
<br> ...
|
|
<br>
|
|
<b>(lldb)</b> run
|
|
<br> ...
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Or:</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> set args 1 2 3
|
|
<br>
|
|
<b>(gdb)</b> run
|
|
<br> ...
|
|
<br>
|
|
<b>(gdb)</b> run
|
|
<br> ...
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> settings set target.run-args 1 2 3
|
|
<br>
|
|
<b>(lldb)</b> run
|
|
<br> ...
|
|
<br>
|
|
<b>(lldb)</b> run
|
|
<br> ...
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Launch a process with arguments in new terminal window (macOS only).</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> process launch --tty -- <args>
|
|
<br>
|
|
<b>(lldb)</b> pro la -t -- <args>
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Launch a process with arguments in existing terminal
|
|
<cope>/dev/ttys006 (macOS only).</cope>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> process launch --tty=/dev/ttys006 -- <args>
|
|
<br>
|
|
<b>(lldb)</b> pro la -t/dev/ttys006 -- <args>
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set environment variables for process before launching.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> set env DEBUG 1
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> settings set target.env-vars DEBUG=1
|
|
<br>
|
|
<b>(lldb)</b> set se target.env-vars DEBUG=1
|
|
<br>
|
|
<b>(lldb)</b> env DEBUG=1
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Unset environment variables for process before launching.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> unset env DEBUG
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> settings remove target.env-vars DEBUG
|
|
<br>
|
|
<b>(lldb)</b> set rem target.env-vars DEBUG
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the arguments that will be or were passed to the program when run.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> show args
|
|
<br> Argument list to give program being debugged when it is started is "1 2 3".
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> settings show target.run-args
|
|
<br> target.run-args (array of strings) =
|
|
<br> [0]: "1"
|
|
<br> [1]: "2"
|
|
<br> [2]: "3"
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set environment variables for process and launch process in one command.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> process launch -E DEBUG=1
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Attach to a process with process ID 123.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> attach 123
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> process attach --pid 123
|
|
<br>
|
|
<b>(lldb)</b> attach -p 123
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Attach to a process named "a.out".</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> attach a.out
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> process attach --name a.out
|
|
<br>
|
|
<b>(lldb)</b> pro at -n a.out
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Wait for a process named "a.out" to launch and attach.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> attach -waitfor a.out
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> process attach --name a.out --waitfor
|
|
<br>
|
|
<b>(lldb)</b> pro at -n a.out -w
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Attach to a remote gdb protocol server running on system "eorgadd", port 8000.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> target remote eorgadd:8000
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> gdb-remote eorgadd:8000
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Attach to a remote gdb protocol server running on the local system, port 8000.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> target remote localhost:8000
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> gdb-remote 8000
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Attach to a Darwin kernel in kdp mode on system "eorgadd".</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> kdp-reattach eorgadd
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> kdp-remote eorgadd
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Do a source level single step in the currently selected thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> step
|
|
<br>
|
|
<b>(gdb)</b> s
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread step-in
|
|
<br>
|
|
<b>(lldb)</b> step
|
|
<br>
|
|
<b>(lldb)</b> s
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Do a source level single step over in the currently selected thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> next
|
|
<br>
|
|
<b>(gdb)</b> n
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread step-over
|
|
<br>
|
|
<b>(lldb)</b> next
|
|
<br>
|
|
<b>(lldb)</b> n
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Do an instruction level single step in the currently selected thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> stepi
|
|
<br>
|
|
<b>(gdb)</b> si
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread step-inst
|
|
<br>
|
|
<b>(lldb)</b> si
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Do an instruction level single step over in the currently selected thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> nexti
|
|
<br>
|
|
<b>(gdb)</b> ni
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread step-inst-over
|
|
<br>
|
|
<b>(lldb)</b> ni
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Step out of the currently selected frame.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> finish
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread step-out
|
|
<br>
|
|
<b>(lldb)</b> finish
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Return immediately from the currently selected frame, with an optional return value.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> return <RETURN EXPRESSION>
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread return <RETURN EXPRESSION>
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Backtrace and disassemble every time you stop.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> target stop-hook add
|
|
<br> Enter your stop hook command(s). Type 'DONE' to end.
|
|
<br> > bt
|
|
<br> > disassemble --pc
|
|
<br> > DONE
|
|
<br> Stop hook #1 added.
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="header" colspan="2">Run until we hit line <b>12</b> or control leaves the current function.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> until 12
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread until 12
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
Breakpoint Commands
|
|
-------------------
|
|
|
|
.. raw:: html
|
|
|
|
<table class="mapping" cellspacing="0">
|
|
<tbody>
|
|
<tr>
|
|
<td class="hed" width="50%">GDB</td>
|
|
<td class="hed" width="50%">LLDB</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set a breakpoint at all functions named <b>main</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> break main
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint set --name main
|
|
<br>
|
|
<b>(lldb)</b> br s -n main
|
|
<br>
|
|
<b>(lldb)</b> b main
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set a breakpoint in file <b>test.c</b> at line <b>12</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> break test.c:12
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint set --file test.c --line 12
|
|
<br>
|
|
<b>(lldb)</b> br s -f test.c -l 12
|
|
<br>
|
|
<b>(lldb)</b> b test.c:12
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set a breakpoint at all C++ methods whose basename is <b>main</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> break main
|
|
<br>
|
|
<i>(Hope that there are no C functions named <b>main</b>)</i>.
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint set --method main
|
|
<br>
|
|
<b>(lldb)</b> br s -M main
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set a breakpoint at and object C function: <b>-[NSString stringWithFormat:]</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> break -[NSString stringWithFormat:]
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint set --name "-[NSString stringWithFormat:]"
|
|
<br>
|
|
<b>(lldb)</b> b -[NSString stringWithFormat:]
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set a breakpoint at all Objective-C methods whose selector is <b>count</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> break count
|
|
<br>
|
|
<i>(Hope that there are no C or C++ functions named <b>count</b>)</i>.
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint set --selector count
|
|
<br>
|
|
<b>(lldb)</b> br s -S count
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="header" colspan="2">Set a breakpoint by regular expression on function name.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> rbreak regular-expression
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint set --func-regex regular-expression
|
|
<br>
|
|
<b>(lldb)</b> br s -r regular-expression
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Ensure that breakpoints by file and line work for #included .c/.cpp/.m files.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> b foo.c:12
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> settings set target.inline-breakpoint-strategy always
|
|
<br>
|
|
<b>(lldb)</b> br s -f foo.c -l 12
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set a breakpoint by regular expression on source file contents.</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> shell grep -e -n pattern source-file
|
|
<br>
|
|
<b>(gdb)</b> break source-file:CopyLineNumbers
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint set --source-pattern regular-expression --file SourceFile
|
|
<br>
|
|
<b>(lldb)</b> br s -p regular-expression -f file
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set a conditional breakpoint</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> break foo if strcmp(y,"hello") == 0
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint set --name foo --condition '(int)strcmp(y,"hello") == 0'
|
|
<br>
|
|
<b>(lldb)</b> br s -n foo -c '(int)strcmp(y,"hello") == 0'
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">List all breakpoints.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info break
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint list
|
|
<br>
|
|
<b>(lldb)</b> br l
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Delete a breakpoint.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> delete 1
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint delete 1
|
|
<br>
|
|
<b>(lldb)</b> br del 1
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Disable a breakpoint.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> disable 1
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint disable 1
|
|
<br>
|
|
<b>(lldb)</b> br dis 1
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Enable a breakpoint.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> enable 1
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> breakpoint enable 1
|
|
<br>
|
|
<b>(lldb)</b> br en 1
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
Watchpoint Commands
|
|
-------------------
|
|
|
|
.. raw:: html
|
|
|
|
<table class="mapping" cellspacing="0">
|
|
<tbody>
|
|
<tr>
|
|
<td class="hed" width="50%">GDB</td>
|
|
<td class="hed" width="50%">LLDB</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set a watchpoint on a variable when it is written to.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> watch global_var
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> watchpoint set variable global_var
|
|
<br>
|
|
<b>(lldb)</b> wa s v global_var
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">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.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> watch -location g_char_ptr
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> watchpoint set expression -- my_ptr
|
|
<br>
|
|
<b>(lldb)</b> wa s e -- my_ptr
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Set a condition on a watchpoint.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> watch set var global
|
|
<br>
|
|
<b>(lldb)</b> watchpoint modify -c '(global==5)'
|
|
<br>
|
|
<b>(lldb)</b> c
|
|
<br> ...
|
|
<br>
|
|
<b>(lldb)</b> bt
|
|
<br> * thread #1: tid = 0x1c03, 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16, stop reason = watchpoint 1
|
|
<br> frame #0: 0x0000000100000ef5 a.out`modify + 21 at main.cpp:16
|
|
<br> frame #1: 0x0000000100000eac a.out`main + 108 at main.cpp:25
|
|
<br> frame #2: 0x00007fff8ac9c7e1 libdyld.dylib`start + 1
|
|
<br>
|
|
<b>(lldb)</b> frame var global
|
|
<br> (int32_t) global = 5
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">List all watchpoints.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info break
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> watchpoint list
|
|
<br>
|
|
<b>(lldb)</b> watch l
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Delete a watchpoint.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> delete 1
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> watchpoint delete 1
|
|
<br>
|
|
<b>(lldb)</b> watch del 1
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
Examining Variables
|
|
-------------------
|
|
|
|
.. raw:: html
|
|
|
|
<table class="mapping" cellspacing="0">
|
|
<tbody>
|
|
<tr>
|
|
<td class="hed" width="50%">GDB</td>
|
|
<td class="hed" width="50%">LLDB</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the arguments and local variables for the current frame.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info args
|
|
<br> and
|
|
<br>
|
|
<b>(gdb)</b> info locals
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> frame variable
|
|
<br>
|
|
<b>(lldb)</b> fr v
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the local variables for the current frame.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info locals
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> frame variable --no-args
|
|
<br>
|
|
<b>(lldb)</b> fr v -a
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the contents of local variable "bar".</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> p bar
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> frame variable bar
|
|
<br>
|
|
<b>(lldb)</b> fr v bar
|
|
<br>
|
|
<b>(lldb)</b> p bar
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the contents of local variable "bar" formatted as hex.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> p/x bar
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> frame variable --format x bar
|
|
<br>
|
|
<b>(lldb)</b> fr v -f x bar
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the contents of global variable "baz".</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> p baz
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> target variable baz
|
|
<br>
|
|
<b>(lldb)</b> ta v baz
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the global/static variables defined in the current source file.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
n/a
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> target variable
|
|
<br>
|
|
<b>(lldb)</b> ta v
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Display the variables "argc" and "argv" every time you stop.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> display argc
|
|
<br>
|
|
<b>(gdb)</b> display argv
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> target stop-hook add --one-liner "frame variable argc argv"
|
|
<br>
|
|
<b>(lldb)</b> ta st a -o "fr v argc argv"
|
|
<br>
|
|
<b>(lldb)</b> display argc
|
|
<br>
|
|
<b>(lldb)</b> display argv
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Display the variables "argc" and "argv" only when you stop in the function named <b>main</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> target stop-hook add --name main --one-liner "frame variable argc argv"
|
|
<br>
|
|
<b>(lldb)</b> ta st a -n main -o "fr v argc argv"
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Display the variable "*this" only when you stop in c class named <b>MyClass</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> target stop-hook add --classname MyClass --one-liner "frame variable *this"
|
|
<br>
|
|
<b>(lldb)</b> ta st a -c MyClass -o "fr v *this"
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Print an array of integers in memory, assuming we have a pointer like "int *ptr".</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> p *ptr@10
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> parray 10 ptr
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
|
|
Evaluating Expressions
|
|
----------------------
|
|
|
|
.. raw:: html
|
|
|
|
<table class="mapping" cellspacing="0">
|
|
<tbody>
|
|
<tr>
|
|
<td class="hed" width="50%">GDB</td>
|
|
<td class="hed" width="50%">LLDB</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Evaluating a generalized expression in the current frame.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> print (int) printf ("Print nine: %d.", 4 + 5)
|
|
<br> or if you don't want to see void returns:
|
|
<br>
|
|
<b>(gdb)</b> call (int) printf ("Print nine: %d.", 4 + 5)
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> expr (int) printf ("Print nine: %d.", 4 + 5)
|
|
<br> or using the print alias:
|
|
<br>
|
|
<b>(lldb)</b> print (int) printf ("Print nine: %d.", 4 + 5)
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Creating and assigning a value to a convenience variable.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> set $foo = 5
|
|
<br>
|
|
<b>(gdb)</b> set variable $foo = 5
|
|
<br> or using the print command
|
|
<br>
|
|
<b>(gdb)</b> print $foo = 5
|
|
<br> or using the call command
|
|
<br>
|
|
<b>(gdb)</b> call $foo = 5
|
|
<br> and if you want to specify the type of the variable:
|
|
<b>(gdb)</b> set $foo = (unsigned int) 5
|
|
<br>
|
|
|
|
</td>
|
|
<td class="content">
|
|
In lldb you evaluate a variable declaration expression as you would write it in C:
|
|
<br>
|
|
<b>(lldb)</b> expr unsigned int $foo = 5
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Printing the ObjC "description" of an object.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> po [SomeClass returnAnObject]
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> expr -o -- [SomeClass returnAnObject]
|
|
<br> or using the po alias:
|
|
<br>
|
|
<b>(lldb)</b> po [SomeClass returnAnObject]
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Print the dynamic type of the result of an expression.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> set print object 1
|
|
<br>
|
|
<b>(gdb)</b> p someCPPObjectPtrOrReference
|
|
<br> only works for C++ objects.
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> expr -d 1 -- [SomeClass returnAnObject]
|
|
<br>
|
|
<b>(lldb)</b> expr -d 1 -- someCPPObjectPtrOrReference
|
|
<br> or set dynamic type printing to be the default:
|
|
<b>(lldb)</b> settings set target.prefer-dynamic run-target
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Calling a function so you can stop at a breakpoint in the function.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> set unwindonsignal 0
|
|
<br>
|
|
<b>(gdb)</b> p function_with_a_breakpoint()
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> expr -i 0 -- function_with_a_breakpoint()
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Calling a function that crashes, and stopping when the function crashes.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> set unwindonsignal 0
|
|
<br>
|
|
<b>(gdb)</b> p function_which_crashes()
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> expr -u 0 -- function_which_crashes()
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
|
|
Examining Thread State
|
|
----------------------
|
|
|
|
.. raw:: html
|
|
|
|
<table class="mapping" cellspacing="0">
|
|
<tbody>
|
|
<tr>
|
|
<td class="hed" width="50%">GDB</td>
|
|
<td class="hed" width="50%">LLDB</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">List the threads in your program.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info threads
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread list
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Select thread 1 as the default thread for subsequent commands.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> thread 1
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread select 1
|
|
<br>
|
|
<b>(lldb)</b> t 1
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the stack backtrace for the current thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> bt
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread backtrace
|
|
<br>
|
|
<b>(lldb)</b> bt
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the stack backtraces for all threads.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> thread apply all bt
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread backtrace all
|
|
<br>
|
|
<b>(lldb)</b> bt all
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Backtrace the first five frames of the current thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> bt 5
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> thread backtrace -c 5
|
|
<br>
|
|
<b>(lldb)</b> bt 5 (<i>lldb-169 and later</i>)
|
|
<br>
|
|
<b>(lldb)</b> bt -c 5 (<i>lldb-168 and earlier</i>)
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Select a different stack frame by index for the current thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> frame 12
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> frame select 12
|
|
<br>
|
|
<b>(lldb)</b> fr s 12
|
|
<br>
|
|
<b>(lldb)</b> f 12
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">List information about the currently selected frame in the current thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> frame info
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Select the stack frame that called the current stack frame.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> up
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> up
|
|
<br>
|
|
<b>(lldb)</b> frame select --relative=1
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Select the stack frame that is called by the current stack frame.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> down
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> down
|
|
<br>
|
|
<b>(lldb)</b> frame select --relative=-1
|
|
<br>
|
|
<b>(lldb)</b> fr s -r-1
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Select a different stack frame using a relative offset.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> up 2
|
|
<br>
|
|
<b>(gdb)</b> down 3
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> frame select --relative 2
|
|
<br>
|
|
<b>(lldb)</b> fr s -r2
|
|
<br>
|
|
<br>
|
|
<b>(lldb)</b> frame select --relative -3
|
|
<br>
|
|
<b>(lldb)</b> fr s -r-3
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the general purpose registers for the current thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info registers
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> register read
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Write a new decimal value '123' to the current thread register 'rax'.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> p $rax = 123
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> register write rax 123
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">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.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> jump *$pc+8
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> register write pc `$pc+8`
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the general purpose registers for the current thread formatted as <b>signed decimal</b>. LLDB tries to use the same format characters as <b>printf(3)</b> when possible. Type "help format" to see the full list of format specifiers.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> register read --format i
|
|
<br>
|
|
<b>(lldb)</b> re r -f i
|
|
<br>
|
|
<br>
|
|
<i>LLDB now supports the GDB shorthand format syntax but there can't be space after the command:</i>
|
|
<br>
|
|
<b>(lldb)</b> register read/d
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show all registers in all register sets for the current thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info all-registers
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> register read --all
|
|
<br>
|
|
<b>(lldb)</b> re r -a
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the values for the registers named "rax", "rsp" and "rbp" in the current thread.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info all-registers rax rsp rbp
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> register read rax rsp rbp
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show the values for the register named "rax" in the current thread formatted as <b>binary</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> p/t $rax
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> register read --format binary rax
|
|
<br>
|
|
<b>(lldb)</b> re r -f b rax
|
|
<br>
|
|
<br>
|
|
<i>LLDB now supports the GDB shorthand format syntax but there can't be space after the command:</i>
|
|
<br>
|
|
<b>(lldb)</b> register read/t rax
|
|
<br>
|
|
<b>(lldb)</b> p/t $rax
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Read memory from address 0xbffff3c0 and show 4 hex uint32_t values.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> x/4xw 0xbffff3c0
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> memory read --size 4 --format x --count 4 0xbffff3c0
|
|
<br>
|
|
<b>(lldb)</b> me r -s4 -fx -c4 0xbffff3c0
|
|
<br>
|
|
<b>(lldb)</b> x -s4 -fx -c4 0xbffff3c0
|
|
<br>
|
|
<br>
|
|
<i>LLDB now supports the GDB shorthand format syntax but there can't be space after the command:</i>
|
|
<br>
|
|
<b>(lldb)</b> memory read/4xw 0xbffff3c0
|
|
<br>
|
|
<b>(lldb)</b> x/4xw 0xbffff3c0
|
|
<br>
|
|
<b>(lldb)</b> memory read --gdb-format 4xw 0xbffff3c0
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Read memory starting at the expression "argv[0]".</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> x argv[0]
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> memory read `argv[0]`
|
|
<br>
|
|
<i><b>NOTE:</b> any command can inline a scalar expression result (as long as the target is stopped) using backticks around any expression:</i>
|
|
<br>
|
|
<b>(lldb)</b> memory read --size `sizeof(int)` `argv[0]`
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Read 512 bytes of memory from address 0xbffff3c0 and save results to a local file as <b>text</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> set logging on
|
|
<br>
|
|
<b>(gdb)</b> set logging file /tmp/mem.txt
|
|
<br>
|
|
<b>(gdb)</b> x/512bx 0xbffff3c0
|
|
<br>
|
|
<b>(gdb)</b> set logging off
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> memory read --outfile /tmp/mem.txt --count 512 0xbffff3c0
|
|
<br>
|
|
<b>(lldb)</b> me r -o/tmp/mem.txt -c512 0xbffff3c0
|
|
<br>
|
|
<b>(lldb)</b> x/512bx -o/tmp/mem.txt 0xbffff3c0
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Save binary memory data starting at 0x1000 and ending at 0x2000 to a file.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> dump memory /tmp/mem.bin 0x1000 0x2000
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> memory read --outfile /tmp/mem.bin --binary 0x1000 0x2000
|
|
<br>
|
|
<b>(lldb)</b> me r -o /tmp/mem.bin -b 0x1000 0x2000
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="header" colspan="2">Get information about a specific heap allocation (available on macOS only).</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info malloc 0x10010d680
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> command script import lldb.macosx.heap
|
|
<br>
|
|
<b>(lldb)</b> process launch --environment MallocStackLogging=1 -- [ARGS]
|
|
<br>
|
|
<b>(lldb)</b> malloc_info --stack-history 0x10010d680
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="header" colspan="2">Get information about a specific heap allocation and cast the result to any dynamic type that can be deduced (available on macOS only)</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> command script import lldb.macosx.heap
|
|
<br>
|
|
<b>(lldb)</b> malloc_info --type 0x10010d680
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="header" colspan="2">Find all heap blocks that contain a pointer specified by an expression EXPR (available on macOS only).</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> command script import lldb.macosx.heap
|
|
<br>
|
|
<b>(lldb)</b> ptr_refs EXPR
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="header" colspan="2">Find all heap blocks that contain a C string anywhere in the block (available on macOS only).</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> command script import lldb.macosx.heap
|
|
<br>
|
|
<b>(lldb)</b> cstr_refs CSTRING
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="header" colspan="2">Disassemble the current function for the current frame.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> disassemble
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> disassemble --frame
|
|
<br>
|
|
<b>(lldb)</b> di -f
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Disassemble any functions named <b>main</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> disassemble main
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> disassemble --name main
|
|
<br>
|
|
<b>(lldb)</b> di -n main
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Disassemble an address range.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> disassemble 0x1eb8 0x1ec3
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> disassemble --start-address 0x1eb8 --end-address 0x1ec3
|
|
<br>
|
|
<b>(lldb)</b> di -s 0x1eb8 -e 0x1ec3
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Disassemble 20 instructions from a given address.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> x/20i 0x1eb8
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> disassemble --start-address 0x1eb8 --count 20
|
|
<br>
|
|
<b>(lldb)</b> di -s 0x1eb8 -c 20
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Show mixed source and disassembly for the current function for the current frame.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
n/a
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> disassemble --frame --mixed
|
|
<br>
|
|
<b>(lldb)</b> di -f -m
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Disassemble the current function for the current frame and show the opcode bytes.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
n/a
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> disassemble --frame --bytes
|
|
<br>
|
|
<b>(lldb)</b> di -f -b
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Disassemble the current source line for the current frame.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
n/a
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> disassemble --line
|
|
<br>
|
|
<b>(lldb)</b> di -l
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
|
|
Executable and Shared Library Query Commands
|
|
--------------------------------------------
|
|
|
|
.. raw:: html
|
|
|
|
<table class="mapping" cellspacing="0">
|
|
<tbody>
|
|
<tr>
|
|
<td class="hed" width="50%">GDB</td>
|
|
<td class="hed" width="50%">LLDB</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">List the main executable and all dependent shared libraries.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info shared
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> image list
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Look up information for a raw address in the executable or any shared libraries.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info symbol 0x1ec4
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> image lookup --address 0x1ec4
|
|
<br>
|
|
<b>(lldb)</b> im loo -a 0x1ec4
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Look up functions matching a regular expression in a binary.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info function <FUNC_REGEX>
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
This one finds debug symbols:
|
|
<br>
|
|
<b>(lldb)</b> image lookup -r -n <FUNC_REGEX>
|
|
<br>
|
|
<br> This one finds non-debug symbols:
|
|
<br>
|
|
<b>(lldb)</b> image lookup -r -s <FUNC_REGEX>
|
|
<br>
|
|
<br> Provide a list of binaries as arguments to limit the search.
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Find full source line information.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> info line 0x1ec4
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
This one is a bit messy at present. Do:
|
|
<br>
|
|
<br>
|
|
<b>(lldb)</b> image lookup -v --address 0x1ec4
|
|
<br>
|
|
<br> and look for the LineEntry line, which will have the full source path and line range information.
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Look up information for an address in <b>a.out</b> only.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> image lookup --address 0x1ec4 a.out
|
|
<br>
|
|
<b>(lldb)</b> im loo -a 0x1ec4 a.out
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Look up information for for a type <code>Point</code> by name.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> ptype Point
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> image lookup --type Point
|
|
<br>
|
|
<b>(lldb)</b> im loo -t Point
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Dump all sections from the main executable and any shared libraries.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> maintenance info sections
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> image dump sections
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Dump all sections in the <b>a.out</b> module.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> image dump sections a.out
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Dump all symbols from the main executable and any shared libraries.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> image dump symtab
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Dump all symbols in <b>a.out</b> and <b>liba.so</b>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> image dump symtab a.out liba.so
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|
|
|
|
Miscellaneous
|
|
-------------
|
|
|
|
.. raw:: html
|
|
|
|
<table class="mapping" cellspacing="0">
|
|
<tbody>
|
|
<tr>
|
|
<td class="hed" width="50%">GDB</td>
|
|
<td class="hed" width="50%">LLDB</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Search command help for a keyword.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> apropos keyword
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> apropos keyword
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Echo text to the screen.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> echo Here is some text\n
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> script print "Here is some text"
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">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 --- maybe 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.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> set pathname-substitutions /buildbot/path /my/path
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
<b>(lldb)</b> settings set target.source-map /buildbot/path /my/path
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td class="header" colspan="2">Supply a catchall directory to search for source files in.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="content">
|
|
<b>(gdb)</b> directory /my/path
|
|
<br>
|
|
</td>
|
|
<td class="content">
|
|
(<i>No equivalent command - use the source-map instead.</i>)
|
|
<br>
|
|
</td>
|
|
</tr>
|
|
|
|
</tbody>
|
|
</table>
|