Xcode Debug调试汇总

栏目: IOS · 发布时间: 7年前

内容简介:遇到EXC_BAD_ACCESS这个错误,那就意味着你向一个已经释放的对象发送消息。Xcode知道这个对象是什么,所以可以让我们知道这个对象在哪里,以及这是什么时候发生的。当开启僵尸模式后,遇到EXC_BAD_ACCESS,xcode可以帮我们快速定位到出现问题的代码。导入@import UIKit
功能 命令
暂停/继续 cmd + ctrl + Y
断点失效/生效 cmd + Y
控制台显示/隐藏 cmd + shift + Y
光标切换到控制台 cmd + shift + C
清空控制台 cmd + K
step over F6
step into F7
step out F8

技巧一:格式化输出数据

代替NSLog,打印对象的内部属性

Xcode Debug调试汇总

技巧二:条件断点(condition)

设置断点触发条件

Xcode Debug调试汇总

注意:

// 正确
(BOOL)[pId isEqualToString:@"short-videopage"]

// 报错:error: no known method '-isEqualToString:'; cast the message send to the method's return type
[pId isEqualToString:@"short-videopage"]
复制代码

技巧三:运行中修改变量的值(expr & call)

在调试登录相关的bug时,非常方便,不用担心经常输密码,还输错的尴尬

Xcode Debug调试汇总

调试UI,改变指定控件的颜色

Xcode Debug调试汇总

技巧四:符号断点(Add Symbolic Breakpoint)

当我们查看一个陌生的项目的时候,我们可以先运行APP,对所有的 viewDidLoad 函数添加断点,进而了解代码执行路径

Xcode Debug调试汇总
Xcode Debug调试汇总
Symbol :符号
methodName
[className methodName]
ClassName.methodName

Module 模块筛选:可以避免不同库中方法名或者函数名相同 Condition 触发条件

这里可以添加一些指定触发条件,比如添加第一个参数(arg3)不能为nil。这里arg4代表第2个参数,以此类推。这里也可以调用方法来判断,但必须是类方法,并且返回值必须为BOOL类型。 样例:找出给[UIImage imageNamed:]传nil的代码。这里就需要设置Symbol为 [UIImage imageNamed:] ,然后Condition设置为 $arg3 == nil 。这样在运行中如果遇到传nil就会触发断点。

Xcode Debug调试汇总
查看某一个函数需要添加断点的符号填写格式(在需要调试的函数打上断点,程序运行走到断点后,从堆栈信息中查看相应函数的格式)

技巧五:全局异常断点(Add Exception Breakpoint)

Xcode Debug调试汇总

技巧六:查看整体UI层级结构(debug view hierarchy)

如果电脑配置较低,最好使用 chisel 插件命令 pviews

Xcode Debug调试汇总

技巧七:开启僵尸模式(EXC_BAD_ACCESS)

遇到EXC_BAD_ACCESS这个错误,那就意味着你向一个已经释放的对象发送消息。Xcode知道这个对象是什么,所以可以让我们知道这个对象在哪里,以及这是什么时候发生的。当开启僵尸模式后,遇到EXC_BAD_ACCESS,xcode可以帮我们快速定位到出现问题的代码。

开启僵尸模式:

Xcode Debug调试汇总

技巧八:查看frame的值

导入@import UIKit

(lldb) p self.view.frame
error: property 'frame' not found on object of type 'UIView *'
error: 1 errors parsing expression
(lldb) e @import UIKit
(lldb) p self.view.frame
(CGRect) $0 = (origin = (x = 0, y = 0), size = (width = 375, height = 667))
复制代码

或者(CGRect)

print (CGRect)[view frame]
(CGRect) $1 = (origin = (x = 0, y = 0), size = (width = 200, height = 100))
复制代码

技巧九:监听所有的点击事件(UIControl、Touch、Gesture)

方法:覆写 UIAppliaction

.h文件

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface CustomApplication : UIApplication

@end

NS_ASSUME_NONNULL_END
复制代码

.m文件

#import "CustomApplication.h"

@implementation CustomApplication
-(void)sendEvent:(UIEvent *)event {
    [super sendEvent:event];
}
@end
复制代码

main.m文件

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "CustomApplication.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc,
                                 argv,
                                 NSStringFromClass([CustomApplication class]),
                                 NSStringFromClass([AppDelegate class]));
    }
}
复制代码

方法执行

一次事件可能会执行三次函数: -(void)sendEvent:(UIEvent *)event 三次的 force 有区别

Xcode Debug调试汇总

一次事件可能会执行两次函数: -(void)sendEvent:(UIEvent *)event 两次的 force 没区别

Xcode Debug调试汇总

响应者链条

1、如果是 UIControl 事件,集成 UIResponder 控件( UIButton )消息传递链(倒序)如下图所示

Xcode Debug调试汇总

2、如果是 UIGestureRecognizer 手势事件,集成 UIResponder 控件( UIView )消息传递链(倒序)如下图所示

Xcode Debug调试汇总

3、如果 UIControl 和 UIGestureRecognizer 同时存在,优先级高

Xcode Debug调试汇总

其他工具:1、 Chisel

Chisel是faceBook开源的lldb调试命令集合

安装( 具体参考 )

Chisel 使用homebrew 来安装

brew update
brew install chisel
复制代码

安装完成后,将下面的命令添加到 ~/.lldbinit 中,xcode启动的时候才会加载chisel

command script import /usr/local/opt/chisel/libexec/fblldb.py
复制代码

常用命令

Xcode Debug调试汇总

查看帮助

(lldb) help
复制代码

参考: Chisel-LLDB命令插件,让调试更Easy

其他工具:2、Reveal

Reveal 绝对是iOS界面调试利器。使用起来不仅比Xcode自带流畅,而且功能更加多。由于收费,30天过后就没怎么用但是绝对好用。

Xcode Debug调试汇总
大约有4中集成方法,详情参加 官网

。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Java语言程序设计

Java语言程序设计

(美) Y. Daniel Liang / 李娜 / 机械工业出版社 / 2011-6 / 79.00元

本书是Java语言的经典教材,畅销多年不衰。本书全面整合了Java的特性,采用“先讲基础”的教学方式,循序渐进地介绍了程序设计基础、面向对象程序设计、GUI程序设计等。另外,本书还全面且深入地覆盖了一些高级主题,包括算法和数据结构、并发、网络、国际化、高级GUI、数据库和Web程序设计等。 本书中文版由《Java语言程序设计 基础篇》和《Java语言程序设计 进阶篇》组成。基础篇对应原书的第......一起来看看 《Java语言程序设计》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具