转自CocoaChina http://www.cocoachina.com/ios/20150225/11190.html

程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode。这篇博客就主要介绍了 Xcode 中几种能够大幅提升代码调试效率的方式。

“If debugging is the process of removing bugs, then programming must be the process of putting them in.”
——Edsger W. Dijkstra

添加条件

有时候我们可能会在某个循环中创建断点,但一次又一次地点击 continue 直到我们想要的条件出现,显然是一种非常低效的方式。好在 Xcode 为我们提供了条件断点。

首先在下列代码中插入一个普通的断点

右键点击断点,选择 Edit Breakpoint,在 Condition 一栏输入 i > 50

这样一来,只有当程序运行满足条件之后才会触发断点了。

Symbolic Breakpoint

Symbolic Breakpoint 是一种非常强大的断点。在 Xcode 中找到 Breakpoint navigator(你可以通过快捷键 command + 7),在最下方点击加号,可以看到它。

添加之后在 Symbol 一栏输入 viewDidLoad。
这样一来,在程序中所有的 viewDidLoad 方法被调用时都会触发断点。

当然,我们也可以仅仅为特定的某个类的方法添加断点。在 Symbol 一栏输入 [ClassName viewDidLoad] (Objective-C) 或 ClassName.viewDidLoad (Swift) 即可。

监控断点

我们调试程序的大部分时候都是为了监控某个变量的变化,在代码中变量出现的地方添加断点不仅累而且还可能漏掉,事后还得一个一个删掉,实在很累。

我们可以通过为变量添加监控断点来简单地做到这一点。

找到变量第一次出现的地方,添加一个普通断点,进入 debug 模式后在 Variables View 中右键变量,选择 Watch 变量名。这样,每一次该变量被改变都会触发断点告知我们。

我们可以在 Console 中看到其变化。(注:在 Xcode 6.1.1 版本中,在监控 Swift 变量时似乎还有一些问题,无法正确地显示变量的值)

日志信息断点

最常见的 Debug 方式应该就是 NSLog and println 了。通常我们会通过这种方式来打印输出各种实例信息以检测程序运行状态。

但这一调试方式也有很明显缺陷:

  1. 无法在运行时添加

  2. 添加数量过多之后干扰视线,又需要麻烦地删除或注释掉

  3. 会编译进 App,在正式版本中需要关闭(当然,我们可以通过宏来判断是否应该编译,但这也需要额外的操作不是吗)

所幸在 Xcode 中我们还有另一种选项。

在如下代码中添加一个普通的断点,选择 Edit Breakpoint,然后点击 Add Action,选择 Log Message,在输入框中输入 The number is: @number@

运行效果如下图所示

这里因为有日志输出,所以我们可以勾选上最下面的 Automatically continue after evaluating actions,这样这个断点就只会安安静静地为我们输出日志了。

发声断点

同日志信息断点,编辑普通断点,Action 选择 Sound。当触发断点时会发出设置的声音。此 Action 配合 Automatically continue after evaluating actions 选项,可以做到酷炫的听声识 Bug。:)

总结

上述的日志信息断点及发生断点都是可以添加触发条件的。通过这些断点操作,自然是能够极大地提升日常开发中调试代码的效率了。

Xcode 的正确打开方式——Debugging(转)的更多相关文章

  1. Xcode 的正确打开方式——Debugging(转载)

    Xcode 的正确打开方式——Debugging   程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode.这篇博客就主要介绍了 Xcode 中几种能 ...

  2. Xcode 的正确打开方式——Debugging

    程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode.这篇博客就主要介绍了 Xcode 中几种能够大幅提升代码调试效率的方式. “If debuggi ...

  3. iOS开发小技巧--相机相册的正确打开方式

    iOS相机相册的正确打开方式- UIImagePickerController 通过指定sourceType来实现打开相册还是相机 UIImagePickerControllerSourceTypeP ...

  4. C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别

    C#语法——泛型的多种应用   本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...

  5. InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式

    InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...

  6. Console控制台的正确打开方式

    Console控制台的正确打开方式 console对象提供了访问浏览器调试模式的信息到控制台 -- Console对象 |-- assert() 如果第一个参数断言为false,则在控制台输出错误信息 ...

  7. 任务队列和异步接口的正确打开方式(.NET Core版本)

    任务队列和异步接口的正确打开方式 什么是异步接口? Asynchronous Operations Certain types of operations might require processi ...

  8. (一)Redis for Windows正确打开方式

    目录 (一)Redis for Windows正确打开方式 (二)Redis for 阿里云公网连接 (三)Redis for StackExchange.Redis 下载地址 官网.中文网1 及 中 ...

  9. List的remove()方法的三种正确打开方式

    转: java编程:List的remove()方法的三种正确打开方式! 2018年08月12日 16:26:13 Aries9986 阅读数 2728更多 分类专栏: leetcode刷题   版权声 ...

随机推荐

  1. cf B George and Round

    题意:输入n,m,下一行为n个数a1<a2<a3......<an:然后再输入m个数b1<=b2<=b3<.....<=bm: 每个ai都必须在b中找到相等的 ...

  2. ISO-7816-1-2-3协议

    第一部分:卡的电气特性一. 卡的触点分配IC卡触点的分配遵循ISO7816-2的规定,如下所示: C1 电源电压(Vcc) C5 地(GND) C2 复位信号(RST) C6 不使用 C3 时钟信号( ...

  3. HDU 5501 背包问题

    需要按照B/C的值从大到小排序. #include<cstdio> #include<cstring> #include<iostream> #include< ...

  4. 【转】Android4.3 蓝牙BLE初步

    原文网址:http://www.cnblogs.com/savagemorgan/p/3722657.html 一.关键概念: Generic Attribute Profile (GATT) 通过B ...

  5. AndroidStudio SVN检出

    版本管理是每个项目的必经之路,很多的ADT都会集成版本管理插件.AS也同样可以集成GITHUB和SVN插件.github对项目有一定的限制,而SVN就比较开放了,所以我们在用AS开发的时候一般用SVN ...

  6. bzoj 1059 [ZJOI2007]矩阵游戏(完美匹配)

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2993  Solved: 1451[Submit][Stat ...

  7. 《A First Course in Probability》-chaper5-连续型随机变量-基本概念

    在利用基本的概率论模型解决实际问题的时候,我们很容易发现一些随机变量的连续分布的,例如火车进站的时间.台灯的寿命等一些和时间相关的随机变量,此时我们发现我们难以求出某个点的概率了,因为随机变量是连续的 ...

  8. poj 4618 暴力

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4618 #include <cstdio> #include <cmath> # ...

  9. 使用jquery trigger 触发a标签的click事件取代window.open方法

    var ohtml='<div class="friend-dialog tac pt15 pb20">'+ '<div class="f-h32&qu ...

  10. tcp dump 截取http

    监听命令 sudo tcpdump -w mm.txt -s 0 -A -v  tcp dst port 8080 -w mm.txt :把记录下来的数据已二进制格式存储在mm.txt文件内  -w ...