Xcode调试

Run

适用场景:可以稳定复现的问题

Debug -> Attach to Process

前提:签名的Provisioning Profile的Entitlements中get-task-allow为true。

默认Development Provisioning Profile这个值是true,Distribution Provisioning Profile这个值时false。在导出ipa做测试的时候,如果希望这个包可以被调试,选择"Save for Development Deployment",不希望被调试,选择“Save for Ad Hoc Deployment”。

调试第三方应用

基本原理还是重签名,但是操作上可以略有不同

操作步骤

1、获取未加密的.app
2、使用iOS App Signer一类的工具,使用开发证书签名,就可以调试了
3、在测试设备上安装、启动应用,连接电脑,打开Xcode -> Debug -> Attach to Process

操作步骤

1、获取解密的app
2、建立同名工程,配置签名
3、在run script中拷贝app到build目录,实际就是用第三方.app替换本项目生成的.app
4、command R

LLDB

lldb的命令只要没有歧义,可以做到唯一匹配,那就可以尽可能的短,如br等效于breakpoint。

breakpoint

# -n,-name 
# 对C语言函数设置断点
breakpoint set -n viewWillAppear
# 对OC方法设置断点
br s -n "-[LoginVC viewWillAppear]"

# 指定文件-f
breakpoint set -f LoginVC.m -n viewWillAppear

# 指定OC方法
breakpoint set --select viewDidLoad
br s -S viewDidLoad

expression

p、po、call都是对expression的封装。

# 查看帮助
(lldb)help expression

# 赋值
expression count = 18

#假设对象有个私有成员变量 _canAnimation,可以通过kvc来查看这个值
po [0x10482c6a0 valueForKey:@"canAnimation"]

# int fuItem[3]
(lldb) po [[XALiveFUManager shareInstance] fuItems][0]
1

framework

当我们对接framework的时候,如果只有framework代码,没有工程代码,能不能debug呢?其实我们只需要拿到工程的ipa和dSYM文件,就可以debug了,通过Attach to Process,使用命令add-dsym将dSYM文件加入target,即可只debug framework,不需要工程的代码

add-dsym ~/.../XXX.dSYM

NSLog

NSLog(@"obj指针内存地址   %x,&obj")
NSLog(@"obj指向的对象的地址 %p",obj);

一个对象可以被多个对象持有,通过Xcode查看这些变量时,显示的都是一样的地址,因为默认显示的是指针指向的对象的地址。

指针本身也是一个变量,有自己的地址,可以输出这个地址。

默认的description显示的也是当前对象指向的对象的地址。

exc_bad_access

使用Instruments, Profile -> Zombies,如果存在问题,会标记出来,可以看到变量引用计数变化的详细过程,相对于勾选scheme中的Diagnostics中的Zombie Objects更加详细,更有帮助。

Debug View Hierarchy

Debug View Hierarchy,一般使用reveal,很少使用Xcode自带的这个,但是Xcode自带的也能解决问题。对于UI异常,像该出现的view没有出现,很有帮助。

Debug Memory Graph

使用Xcode的Debug Memory Graph可以很方便的解决这种问题。

如下图,发现XALivePageVC有个对象没有释放,点击Debug Memory Graph,在左下方搜索,能找到说明对象还存在,也就是没释放,选中就可以看到谁在引用这个对象。一个是navigationController,另外是一个XALiveToolView的toolViewClicled block,剩下的检查一下的代码就可以。

Xcode调试_第1张图片
屏幕快照 2017-11-16 下午9.13.10.png

注意图中灰色线条和加粗黑色线条的含义
灰色:Gray references are unknown, may be stale pointer or not strong
加粗黑色:Bold references are known to be strong

灰色指存在引用,但是不能确定是不是强引用,而黑色加粗表示可以确定是强引用。

你可能感兴趣的:(Xcode调试)