iOS 调试技巧

1。如果还没有日志,在Console中输入po$eax$eax标志出错的地方,适用模拟器,真机用$r0(话说EXC_BAD_ACCESS这种错误模拟器定位就行),还可以输入比如:po[$eaxname]po[$eaxreason]等指令查看错误其他信息(注意方括号后没分号的)。然后,就没有然后了。
2. 一种就是signal SIGABRT,大概的意思就是发送Message出现问题,信号迷失了。

LLDB调试

LLDB支持源文件名,符号名,文件名,等等的命令补全(Commmand Completion)。终端窗口中的补全是通过在命令行中输入一个制表符来初始化的。Xcode控制台中的补全与在源码编辑器中的补全方式是一样的:补全会在第三个字符被键入时自动弹出,或者通过Esc键手动弹出。

watchpoint  监视一个内存块
image    寻址等(强大)
expression    执行一个表达式
call     执行一个调用(界面调试)

1. NSAssert()宏的使用:

断言 NSAssert assert NS_BLOCK_ASSERTIONS

NSAssert 只能在Objective-c里面使用。是assert的一个扩充。能捕获assert类异常及打印一些

可读的日志。而assert只是让app crash(abort).

xcode 中 大家都会在debug(QA) 模式下进行调试代码

所以我们只需要再build Settings 中假如宏定义 变成够 控制 NSAssert的生效范围

例如 只希望debug(QA) 下启动 release(Prod) 不启用,

则添加 NS_BLOCK_ASSERTIONS

使用:#define QLAllert(condition, fmt, ...) NSAssert(condition, (@"---- assert log ---- FilePath : %s function : %s lineNum : %d" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)

2. malloc_info命令查看内存:

(1)xcode -> Edit scheme -> Diagnostics -> Logging 选中 Malloc stack

(2)在控制台执行command script import lldb.macosx.heap  (如果不行,就去掉command试一下,原因还不明确)

(3)执行malloc_info --stack-history 0x10010d680 或者 malloc_info -S 0x10010d680 (对象地址) 结果是:得到这个对象分配之前的内存分配顺序

3. .lldbinit文件

LLDB有了一个启动时加载的文件~/.lldbinit,每次启动都会加载。所以一些初始化的事儿,我们可以写入~/.lldbinit中,比如给命令定义别名等。但是由于这时候程序还没有真正运行,也有部分操作无法在里面玩,比如设置断点。

(1) .lldbinit是一个系统的隐藏文件,开始是不存在的,需要我们创建,但是.开头的文件名是系统预留的,不能创建这样的文件,所以我们可以使用命令行命令touch ~/.lldb创建

(2) 创建完成后我们可以使用vi命令编辑这个文件写入我们想要的初始化操作

(3) display @import UIKit       target stop-hook add -o "target stop-hook disable"

  • 命令1:使用display表示在stop的时候执行@import UIKit
  • 命令2:由于我们只需要执行一次@import UIKit,所以执行完成之后,执行target stop-hook disable,使原有的所有stop-hook失效

这个命令有个缺陷,直接点击Xcode上的pausedebug view hierarchystop-hook不会生效。正在探索有没有更好的办法完成@import UIKit,如果你想到了,可以联系我~

原文地址:https://www.cnblogs.com/wfwenchao/p/4881517.html