2011-03-30 09:02:37 +08:00
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=iso-8859-1" / >
< link href = "style.css" rel = "stylesheet" type = "text/css" / >
< title > LLDB Goals< / title >
< / head >
< body >
< div class = "www_title" >
The < strong > LLDB< / strong > Debugger
< / div >
< div id = "container" >
< div id = "content" >
<!-- #include virtual="sidebar.incl" -->
< div id = "middle" >
< div class = "post" >
< h1 class = "postheader" > LLDB to GDB Command Map< / h1 >
< div class = "post" >
< p > Below is a table of LLDB commands with the GDB counterparts.
The built in GDB compatability aliases in GDB are also
listed.< / p >
< / div >
< div class = "postfooter" > < / div >
< h1 class = "postheader" > Execution Commands< / h1 >
< div class = "post" >
< p >
< table class = "stats" width = "620" cellspacing = "0" >
< tr >
< td class = "hed" width = "50%" > LLDB< / td >
< td class = "hed" width = "50%" > GDB< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Launch a process no arguments.< / td > < / tr >
< td class = "content" >
< b > (lldb)< / b > process launch< br >
< b > (lldb)< / b > run< br >
< b > (lldb)< / b > r
< / td >
< td class = "content" >
< b > (gdb)< / b > run< br >
< b > (gdb)< / b > r
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Launch a process with arguments < code > < args> < / code > .< / td > < / tr >
< td class = "content" >
< b > (lldb)< / b > process launch -- < args> < br >
< b > (lldb)< / b > run -- < args> < br >
< b > (lldb)< / b > r < args>
< / td >
< td class = "content" >
< b > (gdb)< / b > run < args> < br >
< b > (gdb)< / b > r < args>
< / td >
< / tr >
2011-04-12 08:43:35 +08:00
< 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 >
< td class = "content" >
2011-08-17 08:23:09 +08:00
< b > %< / b > lldb -- a.out 1 2 3< br >
2011-04-12 08:43:35 +08:00
< b > (lldb)< / b > run< br >
...< br >
< b > (lldb)< / b > run< br >
...< br >
< / td >
< 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 >
< / tr >
2011-03-30 09:02:37 +08:00
< tr > < td class = "header" colspan = "2" > Launch a process with arguments in new terminal window (Mac OS X only).< / td > < / tr >
< td class = "content" >
< b > (lldb)< / b > process launch --tty -- < args> < br >
< b > (lldb)< / b > process launch -t -- < args> < br >
< / td >
< td class = "content" >
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Launch a process with arguments in existing terminal < cope > /dev/ttys006< / code > (Mac OS X only).< / td > < / tr >
< td class = "content" >
< b > (lldb)< / b > process launch --tty=/dev/ttys006 -- < args> < br >
< b > (lldb)< / b > process launch -t/dev/ttys006 -- < args> < br >
< / td >
< td class = "content" >
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Attach to a process with process ID 123.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > process attach --pid 123< br >
< b > (lldb)< / b > attach -p 123
< / td >
< td class = "content" >
< b > (gdb)< / b > attach 123
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Attach to a process named "a.out".< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > process attach --name a.out< br >
< b > (lldb)< / b > process attach -n a.out
< / td >
< td class = "content" >
< b > (gdb)< / b > attach 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 > (lldb)< / b > process attach --name a.out --waitfor< br >
< b > (lldb)< / b > process attach -n a.out -w
< / td >
< td class = "content" >
< b > (gdb)< / b > attach -waitfor a.out
< / 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 > (lldb)< / b > thread step-in< br >
< b > (lldb)< / b > step< br >
< b > (lldb)< / b > s
< / td >
< td class = "content" >
< b > (gdb)< / b > step< br >
< b > (gdb)< / 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 > (lldb)< / b > thread step-over< br >
< b > (lldb)< / b > next< br >
< b > (lldb)< / b > n< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > next< br >
< b > (gdb)< / b > n
< / 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 > (lldb)< / b > thread step-inst< br >
< b > (lldb)< / b > si< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > stepi< br >
< b > (gdb)< / b > si
< / 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 > (lldb)< / b > thread step-inst-over< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > nexti< br >
< b > (gdb)< / b > ni
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Step out of the currently selected frame.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > thread step-out< br >
< b > (lldb)< / b > finish< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > finish< br >
< / td >
< / tr >
2011-09-13 03:56:07 +08:00
< tr > < td class = "header" colspan = "2" > Display a the variable "argc" and "argv" everytime you stop.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > target stop-hook add --one-liner "frame variable argc argv"< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > display argc< br >
< b > (gdb)< / b > display argv< br >
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Display a the variable "argc" and "argv" only when you stop in the function named < b > main< / b > .< / td > < / tr >
< tr >
< td class = "content" colspan = "2" >
< b > (lldb)< / b > target stop-hook add --name main --one-liner "frame variable 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" colspan = "2" >
< b > (lldb)< / b > target stop-hook add --classname MyClass --one-liner "frame variable *this"< br >
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Backtrace and disassemble every time you stop.< / td > < / tr >
< tr >
< td class = "content" colspan = "2" >
< 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 >
2011-03-30 09:02:37 +08:00
< / table >
< p >
< / div >
< div class = "postfooter" > < / div >
< h1 class = "postheader" > Breakpoint Commands< / h1 >
< div class = "post" >
< p >
< table class = "stats" width = "620" cellspacing = "0" >
< tr >
< td class = "hed" width = "50%" > LLDB< / td >
< td class = "hed" width = "50%" > GDB< / 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 > (lldb)< / b > breakpoint set --name main< br >
< b > (lldb)< / b > breakpoint set -n main< br >
< b > (lldb)< / b > b main
< / td >
< td class = "content" >
< b > (lldb)< / b > break 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 > (lldb)< / b > breakpoint set --file test.c --line 12< br >
< b > (lldb)< / b > breakpoint set -f test.c -l 12< br >
< b > (lldb)< / b > b test.c:12
< / td >
< td class = "content" >
< b > (lldb)< / b > break 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 > (lldb)< / b > breakpoint set --method main< br >
< b > (lldb)< / b > breakpoint set -M main< br >
< / td >
< td class = "content" >
< b > (lldb)< / b > break main< br >
< i > (Hope that there are no C funtions named < b > main< / b > )< / i > .
< / 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 > (lldb)< / b > breakpoint set --selector count< br >
< b > (lldb)< / b > breakpoint set -S count< br >
< / td >
< td class = "content" >
< b > (lldb)< / b > break count< br >
< i > (Hope that there are no C or C++ funtions named < b > count< / b > )< / i > .
< / td >
< / tr >
< / table >
< p >
< / div >
< div class = "postfooter" > < / div >
< h1 class = "postheader" > Examining Thread State< / h1 >
< div class = "post" >
< p >
< table class = "stats" width = "620" cellspacing = "0" >
< tr >
< td class = "hed" width = "50%" > LLDB< / td >
< td class = "hed" width = "50%" > GDB< / 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 > (lldb)< / b > frame variable< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > info args< br >
and< br >
< b > (gdb)< / b > info locals< br >
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Show the stack backtrace for the current thread.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > thread backtrace< br >
< b > (lldb)< / b > bt< br >
< / td >
< td class = "content" >
< b > (gdb)< / 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 > (lldb)< / b > thread backtrace all< br >
< b > (lldb)< / b > bt all
< / td >
< td class = "content" >
< b > (gdb)< / b > thread apply all bt
< / td >
< / tr >
2011-09-09 04:14:22 +08:00
< tr > < td class = "header" colspan = "2" > Select a different stack frame by index for the current thread.< / td > < / tr >
2011-03-30 09:02:37 +08:00
< tr >
< td class = "content" >
2011-09-09 04:14:22 +08:00
< b > (lldb)< / b > frame select 12< br >
2011-03-30 09:02:37 +08:00
< / td >
< td class = "content" >
2011-09-09 04:14:22 +08:00
< b > (gdb)< / b > frame 12
2011-03-30 09:02:37 +08:00
< / td >
< / tr >
2011-09-09 04:14:22 +08:00
< tr > < td class = "header" colspan = "2" > Select the stack frame that called the current stack frame.< / td > < / tr >
2011-03-30 09:02:37 +08:00
< tr >
< td class = "content" >
2011-09-09 04:14:22 +08:00
< b > (lldb)< / b > up< br >
< b > (lldb)< / b > frame select --relative=1< br >
2011-03-30 09:02:37 +08:00
< / td >
< td class = "content" >
2011-09-09 04:14:22 +08:00
< b > (gdb)< / b > up
< / 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 > (lldb)< / b > down< br >
< b > (lldb)< / b > frame select --relative=-1< br >
< b > (lldb)< / b > frame select -r-1< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > down
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Select a different stack frame using a relative offset.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > frame select --relative 2< br >
< b > (lldb)< / b > frame select -r2< br >
< br >
< b > (lldb)< / b > frame select --relative -3< br >
< b > (lldb)< / b > frame select -r-3< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > up 2< br >
< b > (gdb)< / b > down 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 > (lldb)< / b > register read< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > info registers< br >
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Show the general purpose registers for the current thread formatted as < b > unsigned decimal< / b > . LLDB tries to use
the same format characters as < b > printf< / b > when possible.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > register read --format i< br >
< b > (lldb)< / b > register read -f i< br >
< / td >
< td class = "content" >
< / 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 > (lldb)< / b > register read --all< br >
< b > (lldb)< / b > register read -a< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > info all-registers< 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 > (lldb)< / b > register read rax rsp rbp< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > info all-registers 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 > (lldb)< / b > register read --format binary rax< br >
< b > (lldb)< / b > register read -f b rax< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > p/t $rax< br >
2011-03-30 09:02:37 +08:00
< / 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 > (lldb)< / b > memory read --size 4 --format x --count 4 0xbffff3c0< br >
2011-04-12 08:43:35 +08:00
< b > (lldb)< / b > memory read -s4 -fx -c4 0xbffff3c0< br >
2011-09-09 04:14:22 +08:00
< b > (lldb)< / b > x -s4 -fx -c4 0xbffff3c0< br >
2011-03-30 09:02:37 +08:00
< / td >
< td class = "content" >
2011-09-09 04:14:22 +08:00
< b > (gdb)< / b > x/4xw 0xbffff3c0< br >
2011-03-30 09:02:37 +08:00
< / td >
< / tr >
2011-04-12 08:43:35 +08:00
< 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 >
2011-06-16 05:01:30 +08:00
< td class = "content" >
2011-04-12 08:43:35 +08:00
< b > (lldb)< / b > memory read --outfile /tmp/mem.txt --count 512 0xbffff3c0< br >
< b > (lldb)< / b > memory read -o/tmp/mem.txt -c512 0xbffff3c0< br >
< / td >
2011-06-16 05:01:30 +08:00
< 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 >
2011-04-12 08:43:35 +08:00
< / 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" colspan = 2 >
< b > (lldb)< / b > memory read --outfile /tmp/mem.bin --binary 0x1000 0x1200< br >
< b > (lldb)< / b > memory read -o /tmp/mem.bin -b 0x1000 0x1200< br >
< / td >
< / tr >
2011-03-30 09:02:37 +08:00
< tr > < td class = "header" colspan = "2" > Disassemble the current function for the current frame.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > disassemble --frame< br >
< b > (lldb)< / b > disassemble -f
< / td >
< td class = "content" >
< b > (gdb)< / b > disassemble
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Disassemble any functions named < b > main< / b > .< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > disassemble --name main< br >
< b > (lldb)< / b > disassemble -n main
< / td >
< td class = "content" >
< b > (gdb)< / b > disassemble main
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Disassemble an address range.< / td > < / tr >
< tr >
< td class = "content" >
2011-04-12 08:43:35 +08:00
< b > (lldb)< / b > disassemble --start-address 0x1eb8 --end-address 0x1ec3< br >
< b > (lldb)< / b > disassemble -s 0x1eb8 -e 0x1ec3< br >
2011-03-30 09:02:37 +08:00
< / td >
< td class = "content" >
2011-04-12 08:43:35 +08:00
< b > (gdb)< / b > disassemble 0x1eb8 0x1ec3
2011-03-30 09:02:37 +08:00
< / td >
< / tr >
2011-06-16 05:01:30 +08:00
< tr > < td class = "header" colspan = "2" > Disassemble 20 instructions from a given address.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > disassemble --start-address 0x1eb8 --count 20< br >
< b > (lldb)< / b > disassemble -s 0x1eb8 -c 20< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > x/20i 0x1eb8
< / td >
< / tr >
2011-04-06 05:40:10 +08:00
< tr > < td class = "header" colspan = "2" > Show mixed source and disassembly for the current function for the current frame.< / td > < / tr >
2011-03-30 09:02:37 +08:00
< tr >
< td class = "content" >
< b > (lldb)< / b > disassemble --frame --mixed< br >
< b > (lldb)< / b > disassemble -f -m
< / td >
< td class = "content" >
n/a
< / 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" >
< b > (lldb)< / b > disassemble --frame --bytes< br >
< b > (lldb)< / b > disassemble -f -b
< / td >
< td class = "content" >
n/a
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Disassemble the current source line for the current frame.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > disassemble --line< br >
< b > (lldb)< / b > disassemble -l
< / td >
< td class = "content" >
n/a
< / td >
< / tr >
< / table >
< p >
< / div >
< div class = "postfooter" > < / div >
< h1 class = "postheader" > Executable and Shared Library Query Commands< / h1 >
< div class = "post" >
< p >
< table class = "stats" width = "620" cellspacing = "0" >
< tr >
< td class = "hed" width = "50%" > LLDB< / td >
< td class = "hed" width = "50%" > GDB< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > List the main executable and all dependent shared libraries.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > image list< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > info shared< br >
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Lookup information for a raw address in the executable or any shared libraries.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > image lookup --address 0x1ec4< br >
< b > (lldb)< / b > image lookup -a 0x1ec4< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > info symbol 0x1ec4< br >
< / td >
< / tr >
2011-04-12 08:43:35 +08:00
< tr > < td class = "header" colspan = "2" > Lookup information for an address in < b > a.out< / a > only.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > image lookup --address 0x1ec4 a.out< br >
< b > (lldb)< / b > image lookup -a 0x1ec4 a.out< br >
< / td >
< td class = "content" >
< / td >
< / tr >
< tr > < td class = "header" colspan = "2" > Lookup information for for a type < code > Point< / code > by name.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > image lookup --type Point< br >
< b > (lldb)< / b > image lookup -t Point< br >
< / td >
< td class = "content" >
< b > (lldb)< / b > ptype Point< br >
< / td >
< / tr >
2011-03-30 09:02:37 +08:00
< tr > < td class = "header" colspan = "2" > Dump all sections from the main executable and any shared libraries.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > image dump sections< br >
< / td >
< td class = "content" >
< b > (gdb)< / b > maintenance info sections< br >
< / td >
< / tr >
2011-04-12 08:43:35 +08:00
< tr > < td class = "header" colspan = "2" > Dump all sections in the < b > a.out< / b > module.< / td > < / tr >
< tr >
< td class = "content" >
< b > (lldb)< / b > image dump sections a.out< br >
< / td >
< td class = "content" >
< / 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" >
< b > (lldb)< / b > image dump symtab< br >
< / td >
< td class = "content" >
< / 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" >
< b > (lldb)< / b > image dump symtab a.out liba.so< br >
< / td >
< td class = "content" >
< / td >
< / tr >
2011-03-30 09:02:37 +08:00
< / table >
< p >
< / div >
< div class = "postfooter" > < / div >
< p >
< / div >
< / div >
< / div >
< / div >
< / body >
< / html >