>

如何利用

- 编辑:正版管家婆马报彩图 -

如何利用

iOS 调节和测量试验本事:怎么着行使 LLDB 来 Debug,ioslldb

LLDB是XCode内置调节和测量试验工具

前言

在支付中肯定要求到调节和测量检验追踪,可是过多开荒者纵然做过相当多的类型,然则未必领会开荒中有何样调节和测验命令可以支持大家开拓者更加快越来越好地定位到难点所在。

本篇作品重要是传授在付出中什么运用LLDB来Debug。首先会讲一些幼功知识,主借使扶助生手们学习如何去调解。对于有个别相比高端的操作,不会也不曾涉及,可是如若能够支配得了的话,会更有益更急速地查找难点。

图片 1

开班认知LLDB

LLDB是XCode内置的为大家开荒者提供的调节和测量试验工具。至于还不懂什么是调治的,百度时而概念呢,小编也不知什么描述。看看下图吧,应该就足以大要知道如何是调治了!

图片 2

大家加了断点,然后在运维到断点处就停了下来,接下去大家看看lldb这里了吧?大家能够透过lldb所提供的指令来操作。

1.png

骨干调试操作

从上航海用体育场所中,我们三个按键,大家讲讲前三个按键:

  • 先是个按键点击就能够选用那大器晚成栏目了,也就看不见了。

  • 第叁个开关:即便为墨绛红,正是断点有效。若是点击它变成土色,正是具有断点不起功能。

  • 其多少个开关:是三番伍回的野趣,会让程序从断点处恢复持续往下运作,我们点了那个按键后,应用就能够恢复生机符合规律运营状态。

  • 第四个开关是:单步试行的意趣,每点那一个按键一次,程序就能够从大家断点初步的地点,向下实践一步。

  • 第多少个按键是:步入实行的意味,轻便的话正是假如大家当前的断点在三个函数调用上,把么断点会继续走入这几个函数的里边进行调整。

  • 第八个开关是:跳出的意思, 便是只要大家脚下在一个函数中,它会跳出当前的函数,回到函数的调用场。

大家加了断点,然后在运作到断点处就停了下去,接下去大家来看lldb这里了啊?大家得以因而lldb所提供的指令来操作。

常用p、po、call命令

先看下图:

图片 3

以下是输入help命令时打字与印刷出来的,能够看看那四者有哪些两样:

1 2 3 4 5 6 7 8 9 10 11 12 p         -- ('expression --')  Evaluate an expression (ObjC++ or Swift) in                the current program context, using user defined variables and                variables currently in scope. po        -- ('expression -O  -- ')  Evaluate an expression (ObjC++ or Swift)                in the current program context, using user defined variables and                variables currently in scope. print     -- ('expression --')  Evaluate an expression (ObjC++ or Swift) in                the current program context, using user defined variables and                variables currently in scope. call      -- ('expression --')  Evaluate an expression (ObjC++ or Swift) in                the current program context, using user defined variables and                variables currently in scope.

从官方的描述来看,p、print、call是平等的,不过po就不太相符了,输入一样只是出口不相同等。po的出口的是现实对象的故事情节。

若果想要依照一定的格式来打字与印刷,如下:

1 2 3 4 5 6 7 8 (lldb) p/s blogName (__NSCFConstantString *) $9 = @"标哥的技术博客" (lldb) p/x blogName (__NSCFConstantString *) $10 = 0x000000010921c0a8 @"标哥的技术博客" (lldb) p/t blogName (__NSCFConstantString *) $11 = 0b0000000000000000000000000000000100001001001000011100000010101000 @"标哥的技术博客" (lldb) p/a blogName (__NSCFConstantString *) $12 = 0x000000010921c0a8 @ @"标哥的技术博客"

有关这些准绳难点,请查阅打印输出格式化

常用p、po、call命令

从官方的叙述来看,p、print、call是千篇黄金年代律的,不过po就不太同样了,输入相通只是出口不一致。po的出口的是现实指标的内容。

lldb注明变量

我们得以应用e命令定义变量,然后在调度中利用。看如下的事例:

1 2 3 4 5 6 7 8 9 10 (lldb) e NSString *$str = @"http://www.henishuo.com" (lldb) po $str http://www.henishuo.com   (lldb) e int $count = 10 (lldb) p $count (int) $count = 10 (lldb) e NSArray *itemArray = @[@"Test", @"Demo", @"huangyibiao"] (lldb) po $count 10

大家接收e阐明了图片 4发端的变量了吗?我们在宣称和使用时也亟需加上$符号,与PHP相符!

在调节和测量检验时,有时候想不时计算一下某部值来比较时,就足以因而这种格局来完成了,再也不用到源代码处增加上注解达成然后增添一句打字与印刷了,是不是方便了非常多?

lldb注明变量

咱俩得以选拔e命令定义变量,然后在调度中使用。看如下的例证:

(lldb) e NSString *$str = @"http://www.huangyibiao.com"
(lldb) po $str
http://www.huangyibiao.com

(lldb) e int $count = 10
(lldb) p $count
(int) $count = 10
(lldb) e NSArray *itemArray = @[@"Test", @"Demo", @"huangyibiao"]
(lldb) po $count
10

咱们利用e表明了$str变量,然后上面就足以行使了。大家看来通过p命令打字与印刷出来的都以$早先的变量了啊?大家在注解和使用时也供给丰裕$符号,与PHP相符!

在调节和测验时,不经常候想有的时候总结一下某部值来相比时,就足以因此这种艺术来贯彻了,再也不用到源代码处增加上注明完成然后增添一句打字与印刷了,是还是不是方便了累累?

调用变量的API

当大家在断点处,定义了blogName变量了,因而大家能够通过调整命令来调用

1 2 3 4 5 (lldb) po [blogName uppercaseString] 标哥的技术博客   (lldb) po [blogName substringFromIndex:2] 的技术博客
调用变量的API

当大家在断点处,定义了blogName变量了,因而大家能够由此调节和测量试验命令来调用

(lldb) po [blogName uppercaseString]
标哥的技术博客

(lldb) po [blogName substringFromIndex:2]
的技术博客

强转再次回到值类型

当大家调用API重临值类型不指按期,一时候所打字与印刷出来的事物是我们看不懂的,举例上面包车型地铁拿到结果应当是“标”字,可是分裂系列打字与印刷结果却不相近:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 (lldb) po [blogName characterAtIndex:0] 26631   (lldb) po (unsigned int)[blogName characterAtIndex:0] 26631   (lldb) po (char)[blogName characterAtIndex:0] 'a'   (lldb) po (NSString *)[blogName characterAtIndex:0] 0x0000000000006807   (lldb) po (unichar)[blogName characterAtIndex:0] U+6807 u'标'
强转重临值类型

当我们调用API再次来到值类型不指准时,有时候所打字与印刷出来的事物是大家看不懂的,譬如上面包车型地铁拿走结果应当是“标”字,可是分裂类型打字与印刷结果却不一样样:

(lldb) po [blogName characterAtIndex:0]
26631

(lldb) po (unsigned int)[blogName characterAtIndex:0]
26631

(lldb) po (char)[blogName characterAtIndex:0]
'a'

(lldb) po (NSString *)[blogName characterAtIndex:0]
0x0000000000006807

(lldb) po (unichar)[blogName characterAtIndex:0]
U+6807 u'标'

加断点

假定大家不是在风度翩翩开首就增进全数的断点,而在调整起来后,想给其余地点加个断点,那么我们能够很便利地因此命令增添断点:

1 2 (lldb) b ? 33 Breakpoint 9: where = OCLLDBDebugDemo`-[ViewController onButtonClicked:] + 53 at ViewController.m:33, address = 0x000000010921a6d5

那是在现阶段类公事下的33行增加一个断点,增添成功后会有提醒,如这里的升迁正是打响地在33行增加了断点。当然,加多断点的主意也可以有少数种,如:

1 2 (lldb) b ?-[ViewController onButtonClicked:] Breakpoint 4: where = OCLLDBDebugDemo`-[ViewController onButtonClicked:] + 53 at ViewController.m:33, address = 0x000000010921a6d5

事实上也是在33行增添断点。可是大家若要使用动态增加断点,就采纳b命令加行号就足以了,这种最简便了。

安装断点触发条件

看下图,小编是怎么设置触发条件的:

图片 5

2.png

作者们在NSLog那风流罗曼蒂克行,设置了原则,独有当法则满中时,才会步向断点,不过这里并从未让它步向断点,而规范满意时就发出声音并打印提醒语。

这种使用项景首假如在循环遍历数据时,想要断点追踪就只好通过这种措施了,除非增添NSLog打字与印刷,可是这种须求手动增加代码,在调节和测验时才想到要增加一些打字与印刷语句,那时又得重复运转,那太慢了。假设理解怎么设置断点条件,那么就会满意大家的急需了,直接可以设置标准。

设置断点触发条件

看下图,小编是怎么设置触发条件的:

图片 6

大家在NSLog这生机勃勃行,设置了标准化,唯有当法则满中时,才会跻身断点,不过这里并从未让它步向断点,而标准满意时就发出声音并打字与印刷提醒语。

这种使用处景首假使在循环遍历数据时,想要断点追踪就只可以通过这种情势了,除非增加NSLog打字与印刷,不过这种须要手动增多代码,在调治时才想到要增添一些打字与印刷语句,这个时候又得重复运维,那太慢了。如果知道如何设置断点条件,那么就能够满足大家的须要了,直接能够安装标准。

常用打字与印刷视图档期的顺序结构

当大家想要知道有个别视图的组织时,能够透过调用recursiveDescription方法来打字与印刷出来,那么其组织就一清二楚了:

(lldb) po [self.view recursiveDescription]
<UIView: 0x7fdd1052af10; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7fdd1052b290>>
   | <UIButton: 0x7fdd10529070; frame = (66 183; 188 40); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fdd1051bff0>>
   |    | <UIButtonLabel: 0x7fdd104162f0; frame = (41.5 11; 105 18); text = '标哥的技术博客'; alpha = 0.2; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fdd10412590>>
   |    |    | <_UILabelContentLayer: 0x7fdd12804f30> (layer)
   | <_UILayoutGuide: 0x7fdd1052b300; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x7fdd1052b710>>
   | <_UILayoutGuide: 0x7fdd1052c070; frame = (0 568; 0 0); hidden = YES; layer = <CALayer: 0x7fdd1052c200>>

常用打字与印刷视图等级次序结构

当我们想要知道某些视图的构造时,能够透过调用recursiveDescription方法来打字与印刷出来,那么其协会就综上可得了:

1 2 (lldb) po [self.view recursiveDescription] ? | ? | ? ?| ? | ? ?| ? ?|(layer)  ? | ? |
暂且刷新分界面UI

最早叶按键的背景颜色是blueColor,今后我们要在调节和测量检验进度中期维纠正其背景观为革命,并刷新分界面。实行上面包车型大巴命令行,App分界面的按键背景颜色是:

(lldb) e ((UIButton *)sender).backgroundColor = [UIColor redColor]
(UICachedDeviceRGBColor *) $41 = 0x00007fdd10715b00
(lldb) e (void)[CATransaction flush]

一时刷新分界面UI

本demo中,最起头按键的背景颜色是blueColor,以后我们要在调整进程中期维更改其背景观为天蓝,并刷新分界面。实行下边的命令行,App界面包车型大巴按键背景颜色是:

图片 7

(lldb) e ((UIButton *)sender).backgroundColor = [UIColor redColor]
(UICachedDeviceRGBColor *) $41 = 0x00007fdd10715b00
(lldb) e (void)[CATransaction flush]

施行上边的一声令下后,App分界面包车型大巴开关背景颜色是:

图片 8

这种做法很有用的哦。当大家在调节和测验UI时,因为颜料相通而不便于区分出来,不过大家得以在调节和测量检验时经过如此的方法来修改背景观,就毫无给源代码写相应的代码来重新运维看功效了。

在调度下运作方面包车型地铁一声令下后,按键的背景颜色就成为了革命了!

校正变量值

本小节经过使用expr在调试进度中期维更正变量的值,多谢本身的大入室弟子在看完事后传闻自个儿的涉世总结出这一条本事,未来也享受出来给大家~

采纳非常轻便,正是那样的平整:

expr variable = newValue

能够输入help查看!

谢谢小编在标哥的本事博客

最后

写下本篇小说的首要指标是小门徒不太懂调试,写下此篇随笔以援救小入室弟子同期也扶持大家越来越好地在开采中学会去调度代码。其实还会有许多的调养命令,可是一时用,这里就不生龙活虎一列出来说解了,大家若想询问越多,能够输入help查看!

问啊-意气风发键呼叫程序猿答题神器,牛人意气风发对生龙活虎服务,开采者编程必备官方网站:www.wenaaa.com

QQ群290551701 聚焦超级多网络精英,技巧组长,架构师,项目CEO!开源技艺讨论,款待业爱妻士,大牌及生手有志于从事IT行业职员步入!

调节和测验技能:怎么样行使 LLDB 来 Debug,ioslldb 前言 在开采中势应当要到调节和测量试验追踪,可是不菲开辟者固然做过非常多的花色,但是未必通晓开垦中...

本文由网络计算发布,转载请注明来源:如何利用