美文网首页
lldb调试

lldb调试

作者: Liusr | 来源:发表于2017-05-17 17:06 被阅读155次
    《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]]
    
    直接改变了颜色显示
    用处很多,用到时候再去深入体会
    
    

    相关文章

      网友评论

          本文标题:lldb调试

          本文链接:https://www.haomeiwen.com/subject/eemdxxtx.html