LLDB官方文档地址
LLDB调试器
LLVM源代码树,并在lldb 子目录中找到源代码:
git clone https://github.com/llvm/llvm-project.git
请注意,LLDB通常使用CMake和Ninja从top-of-trunk构建。另外它构建:
- 在macOS上生成Xcode项目
- 在Linux和FreeBSD上使用clang和libstdc ++ / libc ++
- 在NetBSD上使用GCC / clang和libstdc ++ / libc ++
- 在Windows上生成VS 2017或更高版本的项目
先说大话:
- 构建库以包含在IDE,命令行工具和其他分析工具中
- 高性能和高效的内存使用
- 可扩展:Python可编写脚本并使用插件架构
- 在有意义的地方重用现有的编译器技术
- 出色的多线程调试支持
- 对C,Objective-C和C ++的大力支持
- 可重定向以支持多个平台
- 为调试器研究和其他创新提供基础
LDB支持各种基本调试功能,如读取DWARF,支持步骤,下一步,完成,回溯等。一些更感兴趣的位是:
- 用于可移植性和可扩展性的插件架构:
- 可执行文件格式的目标文件解析器。目前支持包括Mach-O(32位和64位)和ELF(32位)。
- 对象容器解析器,用于提取文件中包含的对象文件。支持目前包括通用Mach-O文件和BSD档案。
- 调试符号文件解析器以从对象文件中逐步提取调试信息。支持目前包括DWARF和Mach-O符号表。
- 符号供应商插件从可执行对象的各种不同源收集数据。
- 每个体系结构的反汇编插件。支持目前包括用于i386,x86-64,ARM / Thumb和PPC64le的LLVM反汇编程序
- 调试器插件实现调试所需的主机和目标特定功能。
- SWIG生成的脚本桥接允许Python访问和控制调试器库的公共API。
- 远程协议服务器debugserver在i386和x86-64上实现macOS调试。
- 命令行调试器 - lldb可执行文件本身。
- 库的框架API。
编译器集成的好处
LLDB目前将调试信息转换为clang类型,以便它可以利用clang编译器基础结构。这允许LLDB在表达式中支持最新的C,C ++,Objective-C和Objective-C ++语言特性和运行时,而无需重新实现任何此功能。它还利用编译器在对表达式进行函数调用时,在反汇编指令和提取指令细节等时处理所有ABI细节。
主要好处包括:
- 最新的C,C ++,Objective-C语言支持
- 可以声明局部变量和类型的多行表达式
- 支持时使用JIT表达式
- 当不能使用JIT时,评估表达式中间表示(IR)
使用
命令结构
<noun> <verb> [-options [option-value]] [argument [argument...]]
选项可以放在命令行的任何位置,但是如果参数以“ - ”开头,那么你必须告诉lldb你已经完成了当前命令的选项,方法是添加一个选项终止:“ - ”所以例如如果你想启动一个进程并给“进程启动”命令“-stop-at-entry”选项,但是你想要启动你要启动的进程并使用参数“-program_arg value”,你会输入:
(lldb) process launch –stop-at-entry – -program_arg value
要在LLDB中设置相同的文件和换行符,您可以输入以下任一项:
(lldb) breakpoint set –file foo.c –line 12
(lldb) breakpoint set -f foo.c -l 12您可以多次使用-name选项在一组函数上创建断点。
(lldb) breakpoint set –name foo
(lldb) breakpoint set -n foo
(lldb) breakpoint set –name foo –name bar要在名为foo的所有C ++方法上设置断点,您可以输入以下任一项:
(lldb) breakpoint set –method foo
(lldb) breakpoint set -M foo设置一个名为alignLeftEdges的断点Objective-C选择器:
(lldb) breakpoint set –selector alignLeftEdges:
(lldb) breakpoint set -S alignLeftEdges:您可以使用“-shlib <path>”(简称“-s <path>”)将任何断点限制为特定的可执行映像:
(lldb) breakpoint set –shlib foo.dylib –name foo
(lldb) breakpoint set -s foo.dylib -n foolldb命令解释器对命令名进行最短的唯一字符串匹配,因此以下两个命令都将执行相同的命令:
(lldb) breakpoint set -n “-[SKTGraphicView alignLeftEdges:]”
(lldb) br s -n “-[SKTGraphicView alignLeftEdges:]”
设置观察点
除断点外,您还可以使用help watchpoint查看监视点操作的所有命令。例如,我们可能会执行以下操作来查看名为“global”的变量进行写入操作,但只有在条件“(global == 5)”为真时才会停止:
(lldb) watch set var global
(lldb) watch modify -c ‘(global==5)’
(lldb) watch list
(lldb) about to write to ‘global’…
启动或附加到您的程序
要在lldb中启动程序,我们使用“process launch”命令或其内置别名之一:
(lldb) process launch
(lldb) run
(lldb) r您还可以按进程ID或进程名称附加到进程。当按名称附加到进程时,lldb还支持“-waitfor”选项,该选项等待显示该名称的下一个进程,并附加到该进程
(lldb) process attach –pid 123
(lldb) process attach –name Sketch
(lldb) process attach –name Sketch –waitfor启动或附加到进程后,您的进程可能会在某处停止:
1
2
3
4
5(lldb) process attach -p 12345
Process 46915 Attaching
Process 46915 Stopped
1 of 3 threads stopped with reasons:
* thread #1: tid = 0x2c03, 0x00007fff85cac76a, where = libSystem.B.dylib`__getdirentries64 + 10, stop reason = signal = SIGSTOP, queue = com.apple.main-thread
控制你的程序
启动后,我们可以继续,直到我们达到断点。进程控制的原始命令都存在于“thread”命令下:
(lldb) thread continue
Resuming thread 0x2c03 in process 46915
Resuming process 46915
(lldb)步进命令
(lldb) thread step-in // The same as gdb’s “step” or “s”
(lldb) thread step-over // The same as gdb’s “next” or “n”
(lldb) thread step-out // The same as gdb’s “finish” or “f”逐步指令版本:
(lldb) thread step-inst // The same as gdb’s “stepi” / “si”
(lldb) thread step-over-inst // The same as gdb’s “nexti” / “ni”最后,lldb运行直到行或帧退出步进模式:
(lldb) thread until 100
检查堆栈帧状态
- 检查框架参数和局部变量的最方便方法是使用“frame variable”命令:
(lldb) frame variable