使用场景之一,接收他人的项目,快速理清其层次结构,可以打标识符断点,如下图

每一个VC,都加了个在viewDidLoad方法处的断点,这样运行程序时,逐步断点,便可以理清层次,
但是,需要手动不断的继续,依旧不是很好
如果使用LLDB,就事半功倍~
先上效果图

###LIDB简史

Xcode5之前的调试器使用的是GDB,如果你不幸使用,那感觉简直了~然后伴随着Xcode5的发布,LLDB调试器取而代之,成为Xcode工程中默认的调试器,它和LVVM编译器一起,带给开发者丰富的流程控制和数据检测的调试功能.LLDB为Xcode提供了底层调试环境,其中,包括内嵌在Xcode IDE中的调试区域的控制面板,在这里我们可以直接调用LLDB命令.

chisel facebook团队良心出品的LLDB扩展

chisel 安装(需已有Homebrew,其安装很易,如若困惑可私信,这里不展开说明)

 brew update
brew install chisel

安装结束后会打印出路径如 /usr/local/opt/chisel/libexec/fblldb.py
添加下述命令行到 ~/.lldbinit file

 vi ~/.lldbinit
...
command script import /path/to/fblldb.py

_注意:_要将将上述/path/to/fblldb.py ,路径替换为安装成功后的打印出路径如:/usr/local/opt/chisel/libexec/fblldb.py

特别的如果不存在~/.lldbinit file.
可以使用touch ~/.lldbinit 来创建它.

然后,需要重启Xcode,方能使之生效.

LLDB常见命令

Command Description iOS OS X
pviews Print the recursive view description for the key window. Yes Yes
pvc Print the recursive view controller description for the key window. Yes No
visualize Open a UIImage, CGImageRef, UIView, CALayer, NSData (of an image), UIColor, CIColor, or CGColorRef in Preview.app on your Mac. Yes No
fv Find a view in the hierarchy whose class name matches the provided regex. Yes No
fvc Find a view controller in the hierarchy whose class name matches the provided regex. Yes No
show/hide Show or hide the given view or layer. You don't even have to continue the process to see the changes! Yes Yes
mask/unmask Overlay a view or layer with a transparent rectangle to visualize where it is. Yes No
border/unborder Add a border to a view or layer to visualize where it is. Yes Yes
caflush Flush the render server (equivalent to a "repaint" if no animations are in-flight). Yes Yes
bmessage Set a symbolic breakpoint on the method of a class or the method of an instance without worrying which class in the hierarchy actually implements the method. Yes Yes
wivar Set a watchpoint on an instance variable of an object. Yes Yes
presponder Print the responder chain starting from the given object. Yes Yes
... ... and many more!

pviews

该命令是最常用的命令,主要是用来查看布局中view的层级关系的。


图中command+R运行程序后,点击暂停按钮,就可进入lldb控制台,输入pivews命令查看当前布局中view的层级关系。

border/unborder

这两个命令分别是给要查看的view添加边框和移除边框,可以在lldb下输入help border查看具体的用法,如果我要给第二个view添加一个颜色为蓝色,宽度为2的边框,之后再用unborder命令移除,操作如下:

通过help border命令知道border的使用格式如下:

Options:
--color/-c <color>; Type: string; A color name such as 'red', 'green',
'magenta', etc.
--width/-w <width>; Type: CGFloat; Desired width of border.
Syntax: border [--color=color] [--width=width] <viewOrLayer>

其中viewOrLayer表示你要修改的view的地址,我们通过pviews命令知道,第二个view的地址是0x7feae2d605f0,所以我们输入

border -c blue -w 2 0x7feae2d605f0  //添加边框
unborder 0x7feae2d605f0 //移除边框

注意我在输入每个border/unborder命令时,右侧模拟器第二个view的变化。
view的层级关系。

pinternals

这个命令主要是打印view的内部详细信息,太具体了,有需要的可以好好研究研究:

(lldb) pinternals 0x7fa59c2446f0
(WKCompositingView) $451 = {
UIView = {
UIResponder = {
NSObject = {
isa = WKCompositingView
}
_hasAlternateNextResponder = false
_hasInputAssistantItem = false
}
_constraintsExceptingSubviewAutoresizingConstraints = 0x00007fa59c248910 @"0 elements"
_cachedTraitCollection = nil
_layer = 0x00007fa599d81ba0
_layerRetained = nil
_gestureInfo = nil
_gestureRecognizers = nil
_subviewCache = 0x00007fa599f027d0 @"0 elements"
_templateLayoutView = nil
_charge = 0
_tag = 0
_viewDelegate = nil
_backgroundColorSystemColorName = nil
_countOfMotionEffectsInSubtree = 0
_countOfTraitChangeRespondersInDirectSubtree = 0
_cachedScreenScale = 2
_retainCount = 4
_tintAdjustmentDimmingCount = 0
_shouldArchiveUIAppearanceTags = false
_interactionTintColor = nil
_layoutMarginsGuide = nil
_minXVariable = 0x00007fa59c223790
_minYVariable = 0x00007fa59c2237b0
_boundsWidthVariable = 0x00007fa59c223ae0
_boundsHeightVariable = 0x00007fa59c223800
_layoutEngine = 0x00007fa59c014820
_layoutDebuggingIdentifier = nil
_internalConstraints = nil
_continuousCornerRadius = 0
_countOfFocusedAncestorTrackingViewsInSubtree = 0
_semanticContentAttribute = 0
__presentationControllerToNotifyOnLayoutSubviews = nil
_previewingSegueTemplateStorage = nil
_contentSizeNotificationToken = nil
_readableContentGuide = 0x00007fee7c508a00
}
}

pclass

这个可以查看view的层级关系

图中先查看了UIView的层级关系,然后查看了一个第三方自定义的控件MMPlaceHolder的层级关系。

hide/show

这两个命令顾名思义,就是显示和隐藏某个指定的view,话不多说,上图(注意模拟器中第二个view的变化):

taplog

这个命令在你点击屏幕后,lldb打印出你敲击屏幕时接收事件的view的信息。

注意,我是先输入的命令,然后点击了屏幕才打印出对应view的信息。

pvc

这个命令是打印当前的控制器层级,如下图,我定义了一个UINavigationController,ViewController作为它的根控制器。

bmessage

有这么中需求,在当前控制器没有实现某个方法(譬如:-viewWillAppear:)方法,但是我又想在该方法调用时触发中断,这个时候bmessage就派上用场了

(lldb) eobjc id $controller=(id)0x7fe8ab72ab50 //设置controller变量指向当前ViewController
(lldb) bmessage [$controller viewDidAppear:] //给当前ViewController设置断点
Setting a breakpoint at -[UIViewController viewDidAppear:] with condition (void*)(id)$rdi == 0x00007fe8ab72ab50
Breakpoint 1: where = UIKit`-[UIViewController viewDidAppear:], address = 0x000000010e646d12

以上是Chisel最常用的一些命令.当然这个不是全部,算是抛砖引玉.欢迎一起交流.

说说XcodeLLDB调试的那些事儿的更多相关文章

  1. 【黑金原创教程】 FPGA那些事儿 SignalTap II 调试技巧

    简介工具篇系列的第三本教程,讲述各种与SignalTap II 有关的调试技巧. 目录[黑金原创教程] FPGA那些事儿<工具篇III>:File01 - 上线调试与下线调试[黑金原创教程 ...

  2. rocketmq那些事儿之本地调试环境搭建

    上一篇文章中我们已经介绍过rocketmq的集群环境搭建,然而在源码的学习中我们还需要进行本地的调试和问题的定位查找,毕竟还是在本地方便些,今天就说一说如何进行源码的本地调试 下载编译 对于rocke ...

  3. setTimeout那些事儿

    一.setTimeout那些事儿之单线程 一直以来,大家都在说Javascript是单线程,浏览器无论在什么时候,都且只有一个线程在运行JavaScript程序. 但是,不知道大家有疑问没——就是我们 ...

  4. MFC程序中使用调试宏ASSERT()、ASSERT_VALID()、VERIFY()和TRACE()的区别

    其实这篇文章说的很明白了:http://dev.gameres.com/Program/Other/DebugMacro.htm 结论如下: 1.ASSERT()测试它的参数,若参数为0,则中断执行并 ...

  5. iOS---用LLDB调试,让移动开发更简单(一)

    因文章字数超过限制,所以拆分成了上下篇 LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用 ...

  6. Visual Studio原生开发的10个调试技巧

    这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托 ...

  7. Maven开发环境的搭建,含jetty调试[简单明了]

    之前的一片老文,搬过来. 1. Maven的开发环境需要哪些部件a) Maven.去http://maven.apache.org/ 下载.将其bin目录加入进系统PATH.测试方法:用命令mvn – ...

  8. 史上最佳 Mac+PhpStorm+XAMPP+Xdebug 集成开发和断点调试环境的配置

    在上一篇 PHP 系列的文章<PHP 集成开发环境比较>中,我根据自己的亲身体验,非常简略的介绍和对比了几款常用的集成开发环境,就我个人而言,比较推崇 Zend Studio 和 PhpS ...

  9. Visual Studio原生开发的10个调试技巧(一)

    最近碰巧读了Ivan Shcherbakov写的一篇文章,<11个强大的Visual Studio调试小技巧>.这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其 ...

随机推荐

  1. day3 基本语句

         代码缩进为一个tab键  就是四个空格           断点   在代码首行前空白处,双击  然后点右上角臭虫  然后点下面箭头朝下的 1.if 语句  if 判断条件:         ...

  2. LNK2005 连接错误解决办法 2009-10-30 12:13

    nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@ ...

  3. PAT 2-08. 用扑克牌计算24点(25):

    题目链接:http://www.patest.cn/contests/ds/2-08 解题思路:思路参考24点游戏技巧http://www.24game.com.cn/articles/points2 ...

  4. CentOS7上lvm分区调整(resize2fs: Bad magic number in super-block while trying to open ...)

    问题描述:根目录空间占用率100% 首先用传统resize2fs方式调整分区: resize2fs -p /dev/mapper/centos-home 50Gresize2fs 1.42.9 (28 ...

  5. Chrome扩展应用Postman地址(直接搜是搜不到的)

    https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop

  6. 利用python爬取贝壳网租房信息

    最近准备换房子,在网站上寻找各种房源信息,看得眼花缭乱,于是想着能否将基本信息汇总起来便于查找,便用python将基本信息爬下来放到excel,这样一来就容易搜索了. 1. 利用lxml中的xpath ...

  7. Java 8新特性(一):Lambda表达式

    2014年3月发布的Java 8,有可能是Java版本更新中变化最大的一次.新的Java 8为开发者带来了许多重量级的新特性,包括Lambda表达式,流式数据处理,新的Optional类,新的日期和时 ...

  8. 「Netty实战 02」手把手教你实现自己的第一个 Netty 应用!新手也能搞懂!

    大家好,我是 「后端技术进阶」 作者,一个热爱技术的少年. 很多小伙伴搞不清楚为啥要学习 Netty ,今天这篇文章开始之前,简单说一下自己的看法: @ 目录 服务端 创建服务端 自定义服务端 Cha ...

  9. 如何通过seo技术提高网站对用户的友好度

    http://www.wocaoseo.com/thread-129-1-1.html    今天的天气又是29度,眼看着满大街的人都穿着短袖和衬衣了,自己也再不能穿个厚厚的外套出去了,要不会被别人笑 ...

  10. Android Weekly Notes Issue #428

    Android Weekly Issue #428 Kotlin Flow Retry Operator with Exponential Backoff Delay 这是讲协程Flow系列文章中的一 ...