【问题标题】:I encountered a very strange question about LLDB modifying variables遇到一个很奇怪的关于LLDB修改变量的问题
【发布时间】:2020-02-25 16:28:04
【问题描述】:

我在第29行设置断点,想通过LLDB修改值让他进入==1的情况,结果发现这个断点没有打到就跳到了第33行,很奇怪。

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let v = UIView.init(frame: CGRect(x: 100, y: 100, width: 300, height: 300))
        v.backgroundColor = .yellow
        view.addSubview(v)
    }


    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        let value = test()
        print(value)
    }

    func test() -> Bool {
        let m = 3
   29     if m == 1 {
            print(m)
            return true
        } else {
   33        print(m)
            return false
        }
    }
}

Where the breakpoint hit 29 but But the breakpoint jumped to line 33 without hitting

当我将m的值设置为随机数时,断点可以停留在第29行,修改值可以让他进入不同的状态,这让我很困惑

   func test() -> Bool {
        let m = arc4random()
        if m == 1 {
            print(m)
            return true
        } else {
            print(m)
            return false
        }
    }

【问题讨论】:

    标签: swift xcode lldb


    【解决方案1】:

    奇怪的是你没有注意到下面的警告

    知道编译器只是将那部分代码从构建的可执行文件中扔掉并调试信息,因为这些行不存在,因此调试器只是跳转到现有的代码部分。

    【讨论】:

    • 我可以理解,只要弹出这个警告,程序底层就不会编译生成那个代码,直接输入else吧?
    • @Zuqiu,我想说根本没有else,只有let m = 3; print(m); return m;
    • 还有一个很奇怪的事情,我在你的图片上有20行,执行LLDB命令e m = 10,然后执行po m结果是10,但是执行完20行,结果是printed as 3,好像LLDB没有改这个Value,如果不复现,可以把let改成var。你知道这是为什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多