iOS中的实用调试

当您的朋友为您做这些事时,您会想到“在哪儿学到的?”

这篇文章是为Meetup组OC Hack Nights的研讨会而创建的。 如果您在Irvine地区附近,并且想与好人一起做一些有趣的事情,请加入我们! 这是后面的Github链接:https://github.com/huyanhh/DebuggingDemo

调试。 好玩的东西。 这是没人想做的事,但却是必不可少的罪恶。

如果调试是消除软件错误的过程,那么编程必须是将其引入的过程。 ” — Edsger Dijkstra

幸运的是,我们拥有使生活更轻松的工具。 让我们直接深入。

使用的工具和语言:Xcode 8,Swift 3

穴居人调试

有趣的名字,但是它的名字很准确。 命名是在Objective-C时代的某个地方发明的。 这种调试类型是快速,易于使用的调试类型。 除了输入代码外,无需进行任何设置。

我们可以选择打印报表:

print

经典的打印功能,您可以打印出大多数带有完整描述的对象,而无需以任何特定方式对其进行格式化:

  print(self.view)//产生 
  <UIView:0x7f896850a810; 框架=(83 96; 203 138); 自动调整大小= RM + BM; 层= > 

NSLog

作为Objective-C函数,在Swift中也可以使用。 主要区别在于您将使用格式说明符来指定要在运行时传递的参数类型。 它类似于Java中的System.out.format()

在正常情况下,您可能希望使用print ,但是假设我需要观察语句上打印了哪个线程,然后可以在两个不同的函数上使用NSLog进行检查。 容易吧?

  NSLog(“某些视图:%@”,self.view) 
//收益
//格式:日期时间process_name [process_id:thread_id]
  2017-03-28 10:46:11.222 DebuggingDemoFinished [65999:545828] <UIView:0x7f896850a810; 框架=(83 96; 203 138); 自动调整大小= RM + BM; 层= > 

最常见的说明符是:

  %@:对象引用 
%d:整数(带符号)
%ld:长
%f:两倍

您可以在此处阅读更多有关说明符的信息。

设置DEBUG标志:

在Xcode中测试应用程序时,很显然,您将在代码中使用print语句,但是您可能希望在发货时将其保留。 这是您在开发时可以轻松放置的标志:

  ... 
#if调试
打印(“ Hello调试器!”)
#万一
...

Xcode 8默认启用了该功能,但是如果您好奇的话,可以在项目设置中进行定义:

堕胎

我在调试时通常会在代码中添加两个主要语句assertfatalError 。 前者是有条件的中止语句,而后者是在调用时手动使程序崩溃的。

提示 :可以使用fatalError放置占位符以展开可选内容。 如果您有尚未处理的情况,则最好将guard声明放在其中,而不是强行打开可选的包装。 现在,您可以看到程序崩溃时确切具有nil值的位置。 以后您可以轻松地对其进行修改。

 让ana = Hero() 
ana.ultPercentage = Percentage()//可选值
print(ana.ultPercentage!)//不好!!!
保护let ult = ana.ultPercentage else {fatalError()} //更好,稍后再处理
打印(超)

哦,顺便说一句,断言不会在发布版本中进行检查,所以不用担心如果您忘记在发布之前将其删除(尽管那时您的代码应该已经正确了,无论如何它们都会通过)。

绅士调试

如果使用print语句进行调试是Caveman调试,那么使用实际调试器进行调试是什么? 是的,你猜对了。不是真的,我只是自己编造的。 除了名称之外,让我们看一下Xcode调试器的更多实际用途。

当您调试程序时,您会在左侧找到backtrace,然后在底部找到控制台,前者是您调用所有函数的地方,后者是您检查其他所有内容的地方。 我们将对此进行讨论。

Xcode底层调试器lldb(低级调试器)的文档在此处。

苹果的指南在这里。

添加断点

添加断点很简单:转到行号所在的位置,然后单击它,行号所在的位置将出现一个蓝色矩形。 它基本上告诉您的应用程序:“当我运行时,在执行该行之前立即停止。”如果右键单击您设置的断点,甚至可以使用自定义条件对其进行修改:

在控制台的左上角,变量上方,有一个蓝色的断点刻度。 切换为全局打开或关闭应用程序中的所有断点。

另一个巧妙的技巧 :使用断点集运行代码。 看到调试器停止的左侧绿色箭头? 如果您想跳到某一行,也可以移动该箭头! 但是,请小心,如在提示符下所示,如果您执行任何意外行为,它可能会使您的程序崩溃。

lldb的有用命令

如果单击控制台中的右侧窗口,则可以选择键入命令。 使用它来检查变量,修改变量以及所有爵士乐。

po (打印对象或评估表达式):我最喜欢的命令。 用它来打印当前范围内的任何对象。 有用吗?

fr v (或frame variable ):与po相似,但是显示当前作用域中的所有变量。 如果您想深入研究任何单个变量,只需在变量末尾添加名称即可。 几乎与po相同,否则。

p (类似于po ,但是输出具有lldb的特殊格式)

提示 :可以调用p来评估表达式以更改变量,然后立即在代码中传播更改。 例如,如果我有一系列的《守望先锋》英雄,但是我想看看添加重复的英雄会发生什么,而不是在代码中调用它,我可以这样做:

对于更多命令,您可以键入help ,尽管我没有使用其他命令。

奖励:眼球和信息标志

在Xcode的内置工具中,还有另一种方法可以打印出变量! 只需单击控制台左侧窗口中的变量或将鼠标悬停在当前作用域中的变量上,您将看到两个按钮:

右键的作用与po相同; 它打印您要指向的任何变量的描述。 另一方面,向左按钮则有一些幻想:

啊哈! 现在我可以看到我画的任何形状。 (顺便说一下,这是一个CGRect。老实说,如果您单击眼球以获取普通变量,那将非常无聊。)