Заметки по отладке iOS приложений

Заметки по отладке iOS приложений

LLDB init

Команды, которые можно выполнять в консоли, можно добавить в ~/.lldbinit файл, чтобы они выполнялись во время запуска консоли. Обычно тут происходит импорт других скриптов и объявление aliasов.

command script import ~/nameScript.py

command alias poc expression -l objc -O --
command alias 🚽 expression -l objc -- (void)[CATransaction flush]

Выход из метода возвращая конкретный результат

Полезно, если необходимо не перезапуская программу и не меняя исходников сделать так, чтобы метод вернул какой-то другой результат. Необходимо выполнить следующую команду в консоли Xcode:

thread return NO

Вызов приватного API

expression -l objc -O -- [self.view recursiveDescription]

Если вы объявили alias с именем poc из раздела LLDB init, то можно выполнить тоже самое следующей командой:

poc [self.view recursiveDescription]

Вызвать функцию из консоли и остановиться на breakpoint

expr -i 0 -- [self view]

Symbolic breakpoint one shot in other breakpoint

  1. Ставим брекпоинт перед вызовом нужного нам метода, например UILabel setText:
  2. Добавляем брейкпоинту Action с выражением: brekpoint set --one-shot true --name "-[UILabel setText:]"
  3. Ставим галочку "Автоматически продолжить после выполнения Action"

Call method with other args

  1. Ставим брекпоинт на метод, который хотим вызвать с другими параметрами, например changeName(animation: true) будем вызывать с animation = false
  2. Добавляем Action: thread jump --by 1, чтобы пропустить его вызов
  3. Добавляем Action: expression changeName(animation: false)
  4. Ставим галочку "Автоматически продолжить после выполнения Action"

Поправить constraint без перезапуска приложения (View Debugger)

Найти constraint во ViewDebugger. Выделить его и скопировать (⌘C)

e [((NSLayoutConstraint*)0xfffffffff) setConstant: -30]
e CATransaction.flush()

10 апреля 2022 г.