После изменения в lldb значение false все равно оценивается как true в операторе if - PullRequest
1 голос
/ 23 апреля 2019

После изменения логического значения на false в lldb оно все равно будет иметь значение true.Вот упрощенная версия.

=> это точка останова

func getCount(actionWasSuccessful successful: Bool) -> Int {
=>  var count = 0

    // (lldb) po successful (returns true)
    // (lldb) exp successful = false
    // (lldb) po successful (returns false)

    if successful {
=>      count += 1 // breakpoint stops here
    } else {
=>      count = 0 // breakpoint should stop here
    }
    return count
}

let count = getCount(successful: true)
print(count) // returns 1

1 Ответ

3 голосов
/ 24 апреля 2019

Swift разыгрывает трюки с отладочной информацией.Например, он хранит «теневые» копии переменных, которые он сообщает отладчику, чтобы обойти тот факт, что swift настойчиво относится к удалению переменных, как только это может привести к тому, что они больше не доступны.Если он не сделал еще одну копию, которая существует в блоке, в котором определена переменная, многие ваши локальные переменные станут недоступны слишком рано, когда вы пройдете через функцию.Теневые копии обновляются, но в настоящее время lldb не может перенести переход от тени к фактической переменной.

Теневая копия решает одну довольно серьезную проблему отладки за счет ее создания.Сложнее менять значения переменных через отладчик.Из того, что я слышал, более принципиальное решение проблемы не тривиально.

Сообщите об ошибке на bugs.swift.org.Это поможет компилятору правильно расставить приоритеты.

...