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上的
pause
和debug view hierarchy
,stop-hook
不会生效。正在探索有没有更好的办法完成@import UIKit
,如果你想到了,可以联系我~