一、NSLog 问题
NSLog ----- Logs an error message to the Apple System Log facility(将错误消息记录到Apple系统日志工具)
NSLog效率低,具体分析看NSLog效率低下的原因及尝试lldb断点打印Log;优化方法看宏定义的黑魔法 - 宏菜鸟起飞手册。
总结:
- NSLog耗费比较大的资源
- NSLog被设计为error log,是Apple System Log的高层封装
- 在项目中避免提交commit自己的Debug log,release版本更要注意去除NSLog,可以使用自建的log系统或好用的log系统来替代NSLog
- debug不应只局限于log满天飞,lldb断点调试是一个优秀的debug方法,需要再深入研究下
定义一个NSLog宏,替代使用系统NSLog
#define NSLog(format, ...) {
fprintf(stderr, "<%s : %d> %s\n", \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \
__LINE__, __func__); \
(NSLog)((format), ##__VA_ARGS__); \
fprintf(stderr, "-------\n"); \
}
二、Xcode调试
1、LLDB控制台
LLDB控制台。进入控制台需要让程序处于暂停状态:
- 断点或者watchpoint: 在代码中设置一个断点(watchpoint),当程序运行到断点位置的时候,会进入stop状态
- 直接暂停,控制台上方有一个暂停按钮,上图红框已标出,点击即可暂停程序
常用的LLDB,命令
po 打印变量和表达式(对于变量,打印出来的是对象,而不是地址)
expression 或者 expr 执行表达式(变量也可以当成表达式)
p 打印变量或表达式
call 执行表达式(变量也可以当成表达式)
image:常用来寻找栈地址对应代码位置:image lookup --address 0x0000000104c25550
1、对象:
2、表达式:
3、image looup --address 0x0000000104c25550
可以明确定位到是在ViewController的viewDidLoad方法第43行
2、断点调试(Breakpoint)
1、条件断点
断点,设置过滤条件
Condition:返回一个布尔值,当布尔值为真触发断点,一般里面我们可以写一个表达式。
Ignore:忽略前N次断点,到N+1次再触发断点。
2、异常断点
异常断点可以快速定位不满足特定条件的异常,比如常见的数组越界,这时候很难通过异常信息定位到错误所在位置。这个时候异常断点就可以发挥作用了
步骤一
步骤二
步骤三
三、符号断点(Symbolic Breakpoint)
符号断点的创建方式和异常断点一样一样的,在符号断点中可以指定要中断执行的方法:
网友评论