LLDB

官网

https://lldb.llvm.org/

推荐使用谷歌浏览器(自带翻译)

重启

1
2
3
(lldb) process launch
(lldb) run
(lldb) r

带参数重启

1
2
3
(lldb) process launch -- <args>
(lldb) run <args>
(lldb) r <args>

在启动前为进程设置环境变量

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

在启动前为进程取消设置环境变量

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

附加到进程ID为123的进程

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

附加到名为“a.out”的进程。

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

等待名为“a.out”的进程启动并附加

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

在当前选定的线程中执行源代码级别的单个步骤(就是下一步要执行的代码)

1
2
3
(lldb) thread step-in
(lldb) step
(lldb) s

在当前选定的线程中执行源代码级单步执行

1
2
3
(lldb) thread step-over
(lldb) next
(lldb) n

在当前选定线程中执行指令级的单步骤。

1
2
(lldb) thread step-inst
(lldb) si

在当前选定的线程中执行指令级单步执行。

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

跳出当前选择的线程

1
2
(lldb) thread step-out
(lldb) finish

运行到第12行或者控件离开当前函数

1
(lldb) thread until 12

在对象C函数-[NSString stringWithFormat:]处设置断点

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

在count的所有Objective-C方法上设置断点

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

设置条件断点

1
2
3

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

列出所有断点

1
2
3
(gdb) info break
(lldb) breakpoint list
(lldb) br l

删除断点

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

禁用断点

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

启用断点

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

显示当前帧的参数和局部变量

1
2
(lldb) frame variable
(lldb) fr v

显示当前帧的局部变量

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

显示局部变量“bar”的内容

1
2
3
(lldb) frame variable bar
(lldb) fr v bar
(lldb) p bar

显示格式为十六进制的局部变量“bar”的内容

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

显示全局变量“baz”的内容

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

显示在当前源文件中定义的全局/静态变量

1
2
(lldb) target variable
(lldb) ta v

在内存中打印一个整数数组,假设我们有一个类似“int*ptr”的指针

1
(lldb) parray 10 ptr

打印对象的ObjC“描述”

1
2
3
(lldb) expr -o -- [SomeClass returnAnObject]
or using the po alias:
(lldb) po [SomeClass returnAnObject]

调用函数以便可以在函数的断点处停止

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

调用崩溃的函数,并在函数崩溃时停止

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

列出程序中的线程

1
thread list

选择thread1作为后续命令的默认线程

1
2
(lldb) thread select 1
(lldb) t 1

显示当前线程的堆栈回溯

1
2
(lldb) thread backtrace
(lldb) bt

显示所有线程的堆栈回溯

1
2
(lldb) thread backtrace all
(lldb) bt all

回溯当前线程的前五帧

1
2
3
(lldb) thread backtrace -c 5
(lldb) bt 5 (lldb-169 and later)
(lldb) bt -c 5 (lldb-168 and earlier)

列出有关当前线程中当前选定帧的信息

1
(lldb) frame info

选择称为当前堆栈帧的堆栈帧

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

选择当前堆栈帧调用的堆栈帧

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

使用相对偏移选择不同的堆栈帧

1
2
3
4
5
(lldb) frame select --relative 2
(lldb) fr s -r2

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

显示当前线程的通用寄存器

1
(lldb) register read

将新的十进制值“123”写入当前线程寄存器“rax”

1
(lldb) register write rax 123

显示当前线程的所有寄存器集中的所有寄存器

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

显示当前线程中名为“rax”、“rsp”和“rbp”的寄存器的值

1
(lldb) register read rax rsp rbp

显示当前线程中名为“rax”的寄存器的值,格式为二进制

1
2
3
4
5
6
7
(gdb) p/t $rax
(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:
(lldb) register read/t rax
(lldb) p/t $rax

从地址0xbfff3c0读取内存并显示4个十六进制uint32的值

1
2
3
4
5
6
7
8
(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:
(lldb) memory read/4xw 0xbffff3c0
(lldb) x/4xw 0xbffff3c0
(lldb) memory read --gdb-format 4xw 0xbffff3c0

从表达式“argv[0]”开始读取内存

1
2
3
(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:
(lldb) memory read --size `sizeof(int)` `argv[0]`

从地址0xbfff3c0读取512字节的内存,并将结果以文本形式保存到本地文件

1
2
3
(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

将从0x1000开始到0x2000结束的二进制内存数据保存到文件中

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

获取有关特定堆分配的信息(仅在macOS上可用)

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

获取有关特定堆分配的信息,并将结果强制转换为可以推断的任何动态类型(仅在macOS上可用)

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

在块的任何位置查找包含C字符串的所有堆块(仅在macOS上可用)

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

分解当前帧的当前函数

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

反汇编任何名为main的函数

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

分解地址范围

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

从给定地址反汇编20条指令

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

显示当前帧的当前函数的混合源代码和反汇编

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

反汇编当前帧的当前函数并显示操作码字节

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

列出主可执行文件和所有相关的共享库

1
(lldb) image list

查找可执行文件或任何共享库中的原始地址信息

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

查找完整的源代码行信息

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

按名称查找类型Point的信息

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

从主可执行文件和任何共享库转储所有节

1
(lldb) image dump sections

从主可执行文件和任何共享库转储所有符号

1
(lldb) image dump symtab

搜索关键字的命令帮助

1
(lldb) apropos keyword

将文本回显到屏幕上

1
(lldb) script print "Here is some text"

以上内容来自于百度翻译

如有需要请自查官网

官网

https://lldb.llvm.org/

推荐使用谷歌浏览器(自带翻译)