LLDB调试iOS(一)—— 初识LLDB

什么是LLDB

LLDB是下一代、高性能的调试器。它是作为一组可重用组件构建的,它可以高度利用较大LLVM项目中的现有库,例如Clang表达式解析器和LLVM反汇编器。

LLDB是Mac OS X上Xcode的默认调试器,支持在桌面和iOS设备、模拟器上调试C/Objective-C/C++/Swift。

LLDB的进步

  1. 支持现代化的多线程程序
  2. 以高效的方式处理调试符号
  3. 使用基于编码器(LLVM)的代码知识
  4. 支持插件扩展

与LLVM集成的优势

LLDB当前将调试信息转换为clang类型,以便它可以利用clang编译器基础结构。 这允许LLDB在表达式中支持最新的C,C ++,Objective C和Objective C ++语言功能和运行时,而无需重新实现这些功能。 在进行表达式的函数调用,分解指令和提取指令细节时,它还利用编译器处理所有ABI细节,等等。

主要好处包括:

  • C,C ++,Objective C的最新语言支持
  • 可以声明局部变量和类型的多行表达式
  • 支持时使用JIT表达式
  • 在无法使用JIT时评估表达式Intermediate Intermediateation(IR)

LLDB与GDB的不同

1. GDB是GNU项目中的一部分,是为了和GNU编译器协同工作而创建的
2. LLDB是LLVM项目中的一部分,是为了和LLVM编译器协同工作而创建的
3. GDB和LLDB的命令有一些不同。LLDB命令就像OC语法一样,要有形参名,而GDB则不需要,这一点上孰优孰劣就见仁见智了。

LLDB命令结构

为了更好的使用和了解LLDB,所有学习LLDB的用户都应该了解LLDB的命令结构
LLDB的命令都是这样的形式:

1
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]

commandsubcommand都是LLDB调试器对象的名称。命令和子命令按照层次结构排列:特定的命令对象为其后的子命令对象创建上下文,该对象再次为下一个子命令提供上下文,依此类推。
action是你想要在调试器对象(前面提到的命令和子命令)组成的上下文中执行的一些操作。
options:行为修改器(action modifiers)。通常带有一些值。
argument:根据使用的命令的上下文来表示各种不同的东西。

LLBD命令行的解析操作在执行命令之前完成。上面的这些元素之间通过空格来分割,如果某一元素自身含有空格,则可以使用双引用。而如果元素中又包含双引号,则可以使用反斜杠;或者元素使用单引号。如下所示:

1
(lldb) command [subcommand] -option "some \"quoted\" string"

也可以这样表示:

1
(lldb) command [subcommand] -option "some \"quoted\" string"

这种命令解析设计规范了LLDB命令语法,并对所有命令做了个统一。

使用举例

调试快捷键:

1
2
3
4
5
6
command+shift+Y 打开调试窗口
command+Y 调试运行程序
command+option+P 继续
command+shift+O 跳过
command+shift+I 进入
command+shift+T 跳出
  • p/po 这两个命令都是用来做输出调用的,其中p用来打印常量,po用来打印对象
    p/po
  • call:一般只在不需要显示输出,或是方法无返回值时使用call。想要在debug阶段修改view的背景色、试一下label显示更多文字的效果、调用一个忘记调用的函数。。。都可以使用call命令
  • e:可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。e

参考链接