断点调试

添加Action
%B输出断点的名字 %H输出断点的触发次数 @’expression‘@

添加全局类型断点

- swift Error Breakpoint是swift发生throw的时候暂停
- Exception Breakpoint 捕获程序中的异常(数组越界,设置非空参数位nil)
- Symbolic Breakpoint 符号断点 ,使用时不需要找到具体代码处,设置只要执行某个函数就触发断点就可(可以是OC的具体某个方法)
- OpenGL ES Error Breakpoint 发生OpenGL ES错误的时候,暂停在错误处
- Constraint Error Breakpoint 约束错误断点,自动布局控件发生错误
- Test Failure Breakpoint 测试没有通过的时候,暂停在失败的测试处
静态分析工具
静态分析:不进行编译对代码的逻辑、有效性、内存泄漏风险和调用是否异常进行分析
LLDB
查看、修改变量,执行指令
使用expression,动态执行代码,可在运行时修改内存中变量的值,改变内存的轨迹。
expression 变量名
expression 变量 = 赋值
expression只能操作当前数据帧中的变量,如果要操作别的数据帧的内容,需要切换数据帧(frame select num)
frame查看代码帧

frame info
查看数据帧的变量信息frame variable
切换数据帧 frame select 数字标号
使用thread执行操作线程
查看当前线程上所有的数据帧 thread backtrace,然后用frame进行查看
查看当前所有被激活的线程 thread list,*标记了当前所在的线程
类似frame,也可以使用info和select进行线程信息的查看和切换线程。
其他的指令
help 指令名
日志和埋点
日志:系统或程序在运行中会记录各种数据,开发者通过这些数据来进行问题的查找,解决,性能分析。 埋点:分析用户的行为,作为出现问题时的场景复现记录。
有时候一些想不到的Crash发生在用户使用过程中,这时候可以通过向系统注册异常处理函数来捕获这些异常,注册捕获函数:
void UncaughtExceptionHandler(NSException *exception){
// 将Crash的调用栈数据写入本地文件,并打印文件的地址
[exception.callStackSymbols writeToFile:[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject stringByAppendingString:@"/log.log"] atomically:NO];
NSLog(@"%@",[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject stringByAppendingString:@"/log.log"]);
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
return YES;
}
使用腾讯Bugly异常捕获工具
bugly.qq.com/v2/
申请相关的服务,记录APPID和APPKey,使用Pod工具 安装Bugly,在AppDelegate中进行导入,并进行初始化Bugley startWithAppID:@"APP ID",当应用程序崩溃的时候会自动上传到bugly系统,可以登陆进行查看。
埋点
- 页面埋点:某个页面出现的次数,某个页面用户停留的时间
- 行为埋点:用户行为的记录,某个按钮点击的次数,视频或者音频的播放次数
- 系统埋点:观测系统的状态,帮助进行分析异常:内存不足,耗电警告,桢率过低等
实质是当应用程序触发某一条件的时候,应用程序向服务器端发送一条埋点信息。
使用Fabric分析工具
移动端分析工具,出了提供基础的异常上报,运营数据,还提供开发者自定义事件,方便进行埋点。