Изменить значение переменной Int в LLDB - PullRequest
4 голосов
/ 13 марта 2020

Среда: Xcode 11.3.1 / Swift 5

Вот функция:

func lldbTest() {
    var switchInt = 1

    ...// do something and set a break point here

    if switchInt == 1 {
        print("switchInt == 1")
    } else if switchInt == 2 {
        print("switchInt == 2")
    }
}

Я отлаживаю перед вводом оператора if и меняю switchInt до 2 в lldb

e switchInt = 2
p switchInt
(Int) $R4 = 2

, но все равно выдается «switchInt == 1» результат

Ответы [ 2 ]

5 голосов
/ 13 марта 2020

Я предполагаю, что такое поведение объясняется тем, что компилятор уже оценил оператор if "if switchInt == 1", потому что нет кода, который изменяет значение switchInt перед этой строкой. Я попробовал ниже и смог получить желаемое поведение.

var switchInt = 1

for i in 0..<10 {
    switchInt = 0
}

if switchInt == 1 {  -> Put a break point here and use (lldb) e switchInt=2
    print("switchInt == 1")
} else if switchInt == 2 {
    print("switchInt == 2")
}

Теперь выполните команду p switchInt, и она будет иметь значение 2. Пройдите через точку останова, и она выведет switchInt == 2.

0 голосов
/ 13 марта 2020

Установка переменных из отладчика в Swift несколько неудачна. Поскольку swift использует так много обернутых объектов (например, Int - это на самом деле «struct»), компилятор должен выполнить значительную оптимизацию даже при -Onone, иначе код будет работать недопустимо медленно.

Отладчику часто говорят только о теневой копии переменной, а не о местоположении, которое фактически используется в коде. Вы можете попробовать различные приемы, как предлагает Феликс, но в настоящее время вы не гарантированно добьетесь успеха ...

Это известная ошибка, но по техническим причинам ее сложно решить.

...