LLDB调试

LLDB是XCode内置的为我们开发者提供的调试工具,它与LLVM编译器一起,存在于主窗口底部的控制台中,能够带给我们更丰富的流程控制和数据检测的调试功能。在调试过程中熟练使用LLDB,可以让你debug事半功倍。

LLDB可以带来以下体验:

  • 允许你在程序运行的特定时暂停它
  • 查看变量的值
  • 执行自定的指令
  • 按照你所认为合适的步骤来操作程序的进展
  • More

常用基本命令

expr

可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。

如图设置断点,然后运行程序。程序中断后输入下面的命令:

bt

打印调用堆栈,加all可打印所有thread的堆栈

打印

打印变量的值可以使用print命令,print命令的简化方式有prin pri p,幸运的是plldb实现为特指print
该命令如果打印的是简单类型,则会列出简单类型的类型和值。如果是对象,还会打印出对象指针地址,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12

(lldb) print a
(NSInteger) $0 = 0

(lldb) print b
(NSInteger) $1 = 0

(lldb) print str
(NSString *) $2 = 0x0000000100001048 @"abc"

(lldb) print url
(NSURL *) $3 = 0x0000000100206cc0 @"abc"

在输出结果中我们还能看到类似于$0,$1这样的符号,我们可以将其看作是指向对象的一个引用,我们在控制面板中可以直接使用这个符号来操作对应的对象,这些东西存在于LLDB的全名空间中,目的是为了辅助调试。如下所示:

1
2
3
4
(lldb) exp $0 = 100
(NSInteger) $9 = 100
(lldb) p a
(NSInteger) $10 = 100

另外$后面的数值是递增的,每打印一个与对象相关的命令,这个值都会加1。

上面的print命令会打印出对象的很多信息,如果我们只想查看对象的值的信息,则可以使用po(print object的缩写)命令,如下所示:

1
2
(lldb) po str
abc

当然,po命令是”exp -O —“命令的别名,使用”exp -O —”能达到同样的效果。

对于简单类型,我们还可以为其指定不同的打印格式,其命令格式是print/,如下所示:

1
2
(lldb) p/x a
(NSInteger) $13 = 0x0000000000000064

格式的完整清单可以参考Output Formats

expression

在开发中,我们经常会遇到这样一种情况:我们设置一个视图的背景颜色,运行后发现颜色不好看。嗯,好吧,在代码里面修改一下,再编译运行一下,嗯,还是不好看,然后再修改吧~~这样无形中浪费了我们大把的时间。在这种情况下,expression命令强大的功能就能体现出来了,它不仅会改变调试器中的值,还改变了程序中的实际值。我们先来看看实际效果,如下所示:

1
2
3
4
5
(lldb) exp a = 10
(NSInteger) $0 = 10
(lldb) exp b = 100
(NSInteger) $1 = 100
2015-01-25 14:00:41.313 test[18064:71466] a + b = 110, abc

expression命令的功能不仅于此,正如上面的po命令,其实际也是”expression -O —“命令的别名。更详细使用可以参考Evaluating Expressions。



-------------The End-------------

本文标题:LLDB调试

文章作者:kysonyangs

发布时间:2018年05月25日 - 15:05

最后更新:2020年05月17日 - 16:05

原始链接:https://kysonyangs.github.io/default/LLDB调试/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。