lldb调试
2017-05-17 本文已影响155人
Liusr
《ObjC 中国 - 与调试器共舞 - LLDB 的华尔兹》学习笔记
NSUInteger count = 99;
NSString *objects = @"i love china";
//这里打上断点
NSLog(@"%lu %@",count,objects);
//学习几个调试命令:
e 和 p 分别是 expression 和 print
--来表征标识的结束
print 就是 expression -- 的缩写
e count = 10 和
p count = 10//会直接改变程序中 nslog的打印值
e 打印对象 有很多信息,e -o --可以只显示值
简写就是常用的 po
po objects
打印一个变量:
p 16
p/x 16 十六进制打印
p/t 16 二进制打印
p/c 打印字符 p/s 打印以空格结尾的字符串
直接定义变量:
e int $a = 2 变量名前面用$符号
e NSArray *$array = @[@"Monday",@"Saturday",@"Sunday"]
p [$array count]
po [[$array objectAtIndex:0] uppercaseString]
p [[$array objectAtIndex:$a] characterAtIndex:0] //试一试会报错的,无法确定返回类型
//-----------------------------
调试栏下面那几个按钮;
continue, step over, step into, step out
continue命令:c 执行下去,要么到达下一个断点
step over命令: n 黑盒方式执行一行代码,如果这行是一个函数调用,不会跳入,而是执行这个函数
step into命令:s 跳入这个函数,一行一行的
step out直接执行到下一个return(直到一个堆栈帧结束),不小心跳入一个函数,想赶紧跳过 命令是finish
frame info 告知当前执行的行数和源码文件
thread return 后面可以带一个可选参数,立即返回,跳出当前栈帧。跳入函数后用这个命令可以伪造函数返回值。
断点放在函数的开头,然后thread return 命令重写函数,然后继续
// -----------------------------
下面的东西,对应着博客自己学习试验一把:
那些命令不清楚 直接help
lldb可以管理断点,但是我觉得xcode的断点导航用好了也很不错
更新UI, push一个控制器,查找按钮target,观察实例变量的变化,非重写方法的符号断点,
br breakpoint的简写
br li (命令都会有提示的)列出所有断点,会有一些列表,然后
br disable 2 使第二个断点无效
br delete 2 删除第二个,这时候蓝色的断点标志真的没了
br set -f ViewController.m -l 10
使用 help br set 可以发现 -f 代表filename -l 代表 linenum. 恩 但是界面上木有点点,本次调试有效,下次运行无效
给某些函数加断点:
br set -F "-[NSArray objectAtIndex:]"
有个这样的c函数:
static BOOL isEven(int i){
if (i % 2 == 0) {
NSLog(@"%d is even!",i);
return YES;
}
NSLog(@"%d is odd!",i);
return NO;
}
br set -F isEven 就OK了,这些断点会准确停止在函数的开始
要学会用图形化的断点调试
Edit Breakpoint添加一些行为
断点条件,调试命令,shell,log等
当在一个函数中,使用NSLog打印某个变量值或者希望返回值时
可以打个断点,使用print 命令,然后点击Automatically continue after evaluation actions(还有个方法是自定义log,debug时打印,但是这样断点不用加代码啊)
下面还有些高级点东西:比如
(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
<UIWindow: 0x7f86cac14de0; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x6000002470e0>; layer = <UIWindowLayer: 0x600000037480>>
| <UIView: 0x7f86cac16cf0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x600000037840>>
(lldb) e id $myview = (id)0x7f86cac16cf0
(lldb) e (void)[$myview setBackgroundColor:[UIColor blueColor]]
直接改变了颜色显示
用处很多,用到时候再去深入体会