美文网首页
Xcode调试

Xcode调试

作者: 洱舟 | 来源:发表于2019-01-10 18:28 被阅读0次

一、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、对象:

image

2、表达式:

image

3、image looup --address 0x0000000104c25550

image image image

可以明确定位到是在ViewController的viewDidLoad方法第43行

2、断点调试(Breakpoint)

1、条件断点

断点,设置过滤条件

Condition:返回一个布尔值,当布尔值为真触发断点,一般里面我们可以写一个表达式。

Ignore:忽略前N次断点,到N+1次再触发断点。
image

2、异常断点

异常断点可以快速定位不满足特定条件的异常,比如常见的数组越界,这时候很难通过异常信息定位到错误所在位置。这个时候异常断点就可以发挥作用了

步骤一


image

步骤二


image

步骤三


image

三、符号断点(Symbolic Breakpoint)

符号断点的创建方式和异常断点一样一样的,在符号断点中可以指定要中断执行的方法:
image

相关文章

网友评论

      本文标题:Xcode调试

      本文链接:https://www.haomeiwen.com/subject/zwtzrqtx.html