ZhouJiatao's Blog

在iOS中使用LLDB: part 1

什么是LLDB?

LLDB是一款调试器。自Xcode 5后,LLDB就成为Xcode默认调试器。
以下说明摘自官方网站:http://lldb.llvm.org

LLDB is a next generation, high-performance debugger. It is built as a set of reusable components which highly leverage existing libraries in the larger LLVM Project, such as the Clang expression parser and LLVM disassembler.
LLDB is the default debugger in Xcode on Mac OS X and supports debugging C, Objective-C and C++ on the desktop and iOS devices and simulator.
All of the code in the LLDB project is available under the standard LLVM License, an open source “BSD-style” license.

为什么使用LLDB?

  1. 在调试方面,Xcode能做的LLDB都能做,并且LLDB拥有更多的功能;
  2. 你可以在程序运行时,编写并运行新的代码;
  3. 你可以使用python为调试器编写额外的功能;

如何访问到LLDB?

程序执行到断点:

accessLLDB1

或者点击控制台上方的暂停键:

accessLLDB2_0
accessLLDB2_1

需要注意注意的是,通过点击暂停键的方式访问LLDB,不能直接访问到当前ViewController的变量和方法,但你仍然可以访问到程序的全局变量。

LLDB 基本命令

po

Printing the ObjC “description” of an object.

输出对象的“description”。
可以用于对象 或 有返回值的表达式。

poCommand

p

用法和”po”一样,但输出的内容更丰富。输出内容包括类型,地址,字面量.

pCommand

breakpoint 相关命令

breakpoint可缩写为 br。

列出所有断点

br l

br_l

删除指定编号的断点

br delete <id>

br_delete

添加一个断点

b <file>:<line>

addBr

在ViewController.m文件的20行添加了断点,断点id为2。即使Xcode界面没有显示出来,但断点确实已经添加了,通过 “br l”命令可以查看到,程序执行到20行时,断点会被正常触发。

关闭 (disable)一个断点

br di <id>

(lldb) br di 2

启用(enable)一个断点

br e <id>

(lldb) br e 2

添加一个通配断点

br set -n <symbolic>

eg: 为程序所有的viewDidLoad方法设置断点

(lldb) br set -n viewDidLoad

条件断点

给断点设置条件,只有满足条件时才触发断点。

br mod -c “<condition>” <id>

eg: 当 “self.count > 100”时,断点2才会被触发

(lldb) br mod -c "self.count > 100" 2

给断点添加命令

给断点添加命令,断点触发时自动执行。
br com add <id>

addCommandToBr1

上图命令的含义是:

  1. 通过po打印了 self.count的值;
  2. 将 self.count 赋值101 (expr 命令在后续章节介绍);
  3. 再次通过po打印 self.count的值;
  4. 最后用continue命令让程序继续执行。

执行结果如下:
到达断点2时,自动了执行命令

addCommandToBr2

我们在程序运行时,执行了新的代码(self.count = 101),改变了变量 count的值,让程序输出了 “Boom!” !(expr命令很有用,我们将在后续章节做介绍。)
注:你不仅可以通过在控制台为断点添加命令,也可以通过Xcode的图像界面为断点添加命令:

addCommandFromXcode

通过Xcode的图像界面,为断点添加命令有个好处,就是命令会伴随着断点存在。在程序重新运行、Xcode重新启动,命令都不会消失。
而通过控制台为断点添加的命令,只在此次运行有效,在程序下一次运行时就不存在了。

流程命令

  1. continue : (Resume Execution)让程序继续执行。
  2. s : (Step In) 进入方法内部。
  3. n : (Step Over)下一行。
  4. finish: (Step Out)从方法内部跳出。

Xcode的“debug area”上方有4个按钮,分别代表了以上4个命令:

processButton