一、断点
基本操作:添加 、移除、监视(Watch)某个变量。
普通断点
Edit Breakpoint
1、Condition
这里可以输入条件表达式,满足条件的时候断点就会生效。
2、Ingore
在这里可以设置忽略断点次数。
3、Action
Action有6中类型
常用的就是Log Message和Debugger Command
Log Message:%B会打印断点的名字,%H会打印断点的调用次数,@@中间可以输入表达式
Debugger Command:po(打印对象信息),bt(打印函数栈),expression(表达式)。
勾选Automatically continue after evaluating actions之后程序会在断点产生后继续运行。可以输入调试信息至于不暂停程序。(?)
全局断点(Exception Breakpoint)
定位 main 里边的 EXEC_BAD_ACCESS:问题。
OpenGL ES的断点调试(OpenGL ES Error Breakpoint)
符号断点(Symbolic Breakpoint)
当程序运行到特定符号的时候就会产生断点。通过这种方式添加断点,就不需要在源文件中添加,也不需要知道断点设置在文件的第几行。
比普通断点多了两个属性Symbol和Module。
1. 方法名称:会对所有具有此方法名称的类方法生效。例如 initWithFrame: 。
2. 特定类的方法:OC类和C++类都适用,例如 ,[UIView initWithFrame:]或者 Shap::draw()。
3. 函数名称。例如普通C函数。
Test Failure Breakpoint
二、打印
#defineNSLog(format, ...) do { \fprintf(stderr,"<%s : %d> %s\n", \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \
__LINE__, __func__); \
(NSLog)((format), ##__VA_ARGS__); \
fprintf(stderr,"-------\n"); \
}while(0)
三、Console(lldb)控制台命令
资料:http://objccn.io/issue-19-2/
常用调试命令
help --帮助
print --打印
expression —改变程序内的值
po
//p和e来代替print和expression
LLDB 无法确定涉及的类型 (译者注:返回的类型)
// p (char)[[$array objectAtIndex:$a] characterAtIndex:0]
// p/d (char)[[$array objectAtIndex:$a] characterAtIndex:0]
四 、Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS?
EXC_BAD_ACCESS一直是很多开发者的噩梦,因为这个错误很不直观,出现后往往要花很长时间才能定位到错误。苹果这次带来了革命性的提升。
在项目的Scheme中Diagnostics下,选中enable address sanitizer(注意选中后Xcode会重新编译整个项目)。
这样设置后,如果再出现类似的错误会有更详细的错误信息提示,甚至会有内存使用情况的展示。