iOS调试

一. NSLog调试
1 格式
     NSLog(@"打印一个对象:%@",person);
2 几个转换为NSString的方法
    NSStringFromProtocol(<#Protocol * _Nonnull proto#>)
    NSStringFromCGAffineTransform(<#CGAffineTransform transform#>)
    NSStringFromUIEdgeInsets(<#UIEdgeInsets insets#>)
    NSStringFromUIOffset(<#UIOffset offset#>)
    NSStringFromCGVector(<#CGVector vector#>)
    NSStringFromCGPoint(<#CGPoint point#>)
    NSStringFromCGRect(<#CGRect rect#>)
    NSStringFromCGSize(<#CGSize size#>)
    NSStringFromRange(<#NSRange range#>)
    NSStringFromSelector(
@selector(viewDidLoad))
    NSStringFromClass([ViewController class])
3 debug的宏
#ifdef DEBUG
#define DBLog(...) NSLog(@"%s(%d) %@", __PRETTY_FUNCTION__, __LINE__, [NSString stringWithFormat:__VA_ARGS__])

#else

#define DBLog(...)
#endif
4 强化NSLog,添加所属文件,所在方法和行数
#define NSLog(format, ...) do { \
fprintf(stderr,
"<%s : %d> %s\n", \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \
__LINE__, __func__); \
(NSLog)((format), ##__VA_ARGS__); \
fprintf(stderr,
"-------\n"); \
} while (0)
#ifdef DEBUG
#define DBLog(...) NSLog(@
"%@",[NSString stringWithFormat:__VA_ARGS__])
#else
#define DBLog(...)
#endif
5 添加检索跟踪堆栈(当出现bug时可以清除看出)
NSlog(@“%@“,[NSThread callStackSymbols]);

二 断点
1 普通断点:当前行处点击或command+\
2 全局断点:出现异常的时候,停止在异常处
  
3 符号断点
  执行到ViewController的viewDidLoad方法时,断点

 执行到所有的viewDidLoad方法时,断点


4 监控断点
 监控某个变量变化的断点

5 条件断点
对断点进行编辑,可以设置中断的条件,也可以忽略该断点执行的前n次,还可以查看某个方法被调用的次数

action:
(1)Log Message:在这里填写的东西可以打印到控制台.%B会打印断点的名字,%H会打印断点的调用次数,@@中间可以输入表达式
(2)Debugger Command:
这里可以输入调试命令,也就是po(打印对象信息),bt(打印函数栈)expression(表达式)这些调试命令
(3)Automatically continue after evaluating actions之后程序会在断点产生后继续运行
三  LLDB
1 在程序需要的地方设置断点,当断点段的时候就可以进入LLDB调试器了
2 常用快捷键
  command+shift+y 调试窗口显示/隐藏
  command+y 调试运行程序
  command+option+P继续
  command+shift+o跳过
  command+shift+I 跳入
  command+shift+T跳出
3 常用指令lldb
  (1) help;
  (2) print(p);
   $1,可以用来指向这个结果,任何以美元符开头的东西都是存在于 LLDB 的命名空间的

  (3)p po call都可以用来调用方法,区别是:p和po都是用于输出的有返回值的。call一般只在不需要显示输出,或是方法无返回值时使用。

po :print objects
p输出的是基本类型,po输出的Objective-C对象
(4)expression
可以用e:声明新的变量,也可以改变已有变量的值. $开头

(5)image
image 命令可用于寻址,有多个组合命令。
比较实用的用法是用于寻找栈地址对应的代码位置。

(6)bt 
  打印调用堆栈,加all可打印所有thread的堆栈。
(7)流程控制指令
继续:process continue,continue,c
下一步:thread step-over,next,n
进入:thread step-in,step,s
跳出:thread step-out,finish,f 
(8)thread return
执行thread return命令可以使得当前函数立即返回,也就是说,后续代码都不会执行了。当然执行此命令可能会使得arc的计数追踪出现错乱。
 需要一个参数指明函数强制返回的返回值
(9) 断点命令
可以在断点中执行p 命令
(10) watchPoint
可以在某个变量被写入/读取时暂停程序运行:
  三 开启僵尸对象Zombie
开启Zombie模式之后会导致内存上升,因为所以已经被释放(引用计数为0)的对象被僵尸对象取代,并未真的释放掉。
这个时候再给僵尸对象发送消息,就会抛出异常,并打印出异常信息,你可以轻松的找到错误代码位置,结束Zombies时会释放。它的主要功能是检测野指针调用。
四 地址消毒剂 address sanitizer
         当程序创建变量分配一段内存时,将此内存后面的一段内存也冻结住,标识为中毒内存。程序访问到中毒内存时(访问越界),立即中断程序,抛出异常并打印异常信息。
         你可以根据中断位置及输出的Log信息来解决错误。当然,如果变量已经释放了,它所占用的内存也会被标识为中毒内存,这个时候访问这片内存空间同样会抛出异常。
五 Analyze静态分析
    分析代码的内存泄漏问题
   

六   instrument 的 leaks工具
   运行时,自动检测内存泄漏问题
   instrument

  leaks

七 memory
   调试内存图,查看哪个VC有内存泄漏
八视图调试



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值