1.常用3种断点
文件行断点:在某一行代码处的断点
符号断点:可以定位到某些方法
异常断点:可以在抛出或者捕获异常时调用,可以选择不同的语言(c/c++/object-c)
swift断点:捕捉swift中的错误
测试失败的断点:还未尝试过.
2.抛出异常:使用断言NSAssert
NSAssert(i<95, @"i=%d已经大于95了",i);
还能使用NSAssert1,NSAssert2,NSAssert3,NSAssert4,NSAssert5.
3.发布时移除NSAssert
步骤:
为工程添加一个新的scheme,命名最好不同;
编辑这个新的scheme,在Info选项->Build Configuration 下改为release,为发布而配置。
在新的scheme下,进入Target->Build Settings->Apple LLVM 7.0-Preprocessing->Preprocessor Macros目录下;
为release选项添加NS_BLOCK_ASSERTIONS即可。
(注:NS_BLOCK_ASSERTIONS是Foundation框架中定义好的预处理宏)
4.发布时移除NSLog
基本思路是用一个新的输出的宏取代NSLog,如果是已有的工程可能工作量比较大.
在pch文件中加入新的宏:
/*
#ifdef DEBUG
# define DLog(...) NSLog(__VA_ARGS__)
#else
# define DLog(...)
#endif
*/
注意__VA_ARGS__前后是长横。
同样进入进入Target->Build Settings->Apple LLVM 7.0-Preprocessing->Preprocessor Macros目录下,
将Debug改为DEBUG或者DEBUG=1.(新的系统下应该可以省略这一步)
记得以后输出时统一使用DLog即可.
5.使用LLDB调试工具
进入LLDB工具:设置一个断点,运行到断点时,将All Output改为Debugger Output.
5.1 使用命令设置断点(在第30行):
(lldb) breakpoint set --file ViewController.m --line 31
(lldb) br s -f ViewController.m -l 30
(lldb) b ViewController.m:31
如果要在所有用某个方法调用时挂起(符号断点),命令如下:
(lldb) breakpoint set --selector findAll
(lldb) br s -S findAll
查看断点:
(lldb) breakpoint list
(lldb) br l
删除断点(每个断点都有编号):
(lldb) breakpoint delete
(lldb) br del
单步进入:
(lldb) thread step-in
(lldb) step
(lldb) s
单步跳过:
(lldb) thread step-over
(lldb) next
(lldb) n
继续运行:
(lldb) thread continue
(lldb) continue
(lldb) c
5.2 观察点变化(可以查看变量的变化)
设置观察点
(lldb) watchpoint set variable sum
(lldb) wa s v sum
查看观察点
(lldb) watchpoint list
(lldb) watch l
删除观察点(没有编号则会删除所有观察点)
(lldb) watchpoint delete 观察点编号
(lldb) watch delete 观察点编号
(lldb) watch del 观察点编号
5.3查看变量和计算表达式命令
(lldb) frame variable
(lldb) fr v
单个变量
(lldb) frame variable sum
(lldb) fr variable
(lldb) fr v
(lldb) print sum
查看全局变量
(lldb) target variable
(lldb) ta v
计算基本数据类型表达式
(lldb) expression sum
(lldb) expr sum
(lldb) p sum //打印单个变量
计算对象数据类型表达式
(lldb) expression -o -- self.textArray[0]
(lldb) po self.textArray[2]
6.异常堆栈报告分析
将main函数改为如下
@try {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
@catch (NSException *exception) {
NSLog(@"Stack Trace:%@",[exception callStackSymbols]);
}
所有的异常最后都会抛出到main函数中。查看输出的异常日志。
3 BreakPointTest 0x000df6fb -[ViewController viewDidLoad] + 446
7.调试问题汇总
1.如果能够捕获到异常使用异常分析机制,或者查看崩溃日志
2.如果无法捕获异常,也没有输出则需要保证方法不要重复调用,否则可能引起内存问题。