Чем может быть опасна команда `po` в отладчике LLDB?

«Чем может быть опасна команда `po` в отладчике LLDB?» — вопрос из категории Тестирование, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Команда po (print object) в LLDB опасна тем, что выполняет код с побочными эффектами, что может необратимо изменить состояние отлаживаемой программы.

Основные риски:

  1. Неожиданные изменения состояния: po вычисляет выражение, вызывая геттеры и методы description/debugDescription. Если они модифицируют свойства, это приводит к багам.
    class RiskyClass {
        private var accessCount = 0
        var description: String {
            accessCount += 1 // ПОБОЧНЫЙ ЭФФЕКТ!
            return "Accessed (accessCount) times"
        }
    }
    let obj = RiskyClass()
    // Ввод в LLDB: `po obj` изменит внутреннее состояние `accessCount`
  2. Снижение производительности: Сложная логика в description может быть ресурсоемкой.
  3. Краши: При обращении к освобожденным (zombie) объектам через динамическую диспетчеризацию.

Безопасные альтернативы:

  • p или print: Выводят значение без вызова description.
  • frame variable: Прямой доступ к переменным в текущем стековом фрейме, самый безопасный вариант.
  • v: Команда, аналогичная frame variable.

Правило: Используйте po только для инспекции простых, неизменяемых данных. Для отладки состояния используйте v или p.