0%

LLDB

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 foo

  • lldb命令解释器对命令名进行最短的唯一字符串匹配,因此以下两个命令都将执行相同的命令:
    (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

不想写了,用到的时候,写一些用到的东西吧,学习的话,大家去看官方文档吧!!!

希望对您有所帮助,您的支持将是我莫大的动力!