Отладка - неотъемлемая часть всего процесса разработки программного обеспечения. Хороший программист должен обладать эффективными навыками отладки, чтобы в конечном итоге писать код без ошибок.

В этой статье мы познакомимся с отладкой Xcode с помощью команд LLDB, которые избавляют от необходимости перекомпилировать код для каждой модификации.

Совет 1. Команда выражения

Эффективное использование команды выражения и настройка точки останова таким образом, что перекомпиляция кода не требуется.

Если вы хотите исключить любой код при достижении точки останова, используйте команду выражения в консоли Xcode. В консоли Xcode введите команду ниже с кодом, который вы хотите выполнить.

expression 'Code line to be evaluated'

Точку останова также можно настроить так, чтобы это выполнялось автоматически, добавив ту же команду выражения на вкладке редактирования точки останова.

Используйте команду выражения для вставки кода между отладкой. В приведенном ниже примере первоначальное значение текста - «Раздел деловых новостей». Используя команду выражения в текстовой строке консоли, можно изменить.

Когда использовать?

Если вам нужно просмотреть более сложные данные или изменить данные программы, вы можете использовать общую команду «выражение». Он принимает выражение и оценивает его в области текущего выбранного кадра во время отладки.

Совет 2. Символические точки останова

Символьные точки останова очень эффективны, и их можно добавить к любому методу, имя которого совпадает с символом точки останова. Разработчикам не нужно беспокоиться о сигнатуре метода или о том, какому модулю он принадлежит. Добавьте имя метода, для которого должна быть запущена точка останова, в поле символа точки останова, как показано в примере ниже.

Объективные методы формата C, такие как [UILable setText:], запускаются, когда его имя добавляется в символические точки останова. В приведенном ниже примере точка останова запускается на строке.

cell.title.text = getTextForEachSection

В этом случае при достижении точки останова мы начнем смотреть на ассемблерный код, потому что у нас нет исходного кода для UIKitCore.

Не пугайтесь, если вы работаете в ассемблерном коде системных фреймворков, поскольку мы можем проверять аргументы, переданные в функцию setText, с помощью псевдорегистров. псевдо-регистры предоставляются отладчиком для просмотра аргументов, содержащихся в регистрах.

  • $ arg1 - мы видим получателя сообщения цели c
  • (SEL) $ arg2 - селектор. (SEL) необходимо, поскольку LLDB не знает типов этих аргументов.
  • $ arg3: первый параметр, переданный в функцию.

Когда использовать?

Исправление предупреждений автоматического макета в консоли, таких как UIViewAlertForUnsatisfiableConstraints, и предупреждений, связанных с макетом, например UICollectionViewFlowLayoutBreakForInvalidSizes.

Совет 3. Добавление условия в точки останова

Может быть случай, когда символическая точка останова срабатывает очень часто, когда больше объектов имеют символы, соответствующие точке останова. Мы можем избежать этого, добавив условие, которое запускает точку останова, только если это условие выполнено.

Совет 4. Одноразовая точка останова

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

breakpoint set --one-shot true --name "-[UILabel setText:]"

В приведенном выше примере символическая точка останова «setText» активируется только после того, как была достигнута точка останова с одним выстрелом.

Совет 5: пропустите выполнение строки кода, чтобы упростить отладку.

Во многих случаях мы хотим сэкономить время на отладку, пропуская часть кода. Мы можем сделать это, попросив отладчик пропустить код.

  • Перетащите маркер захвата рядом с потоком точки останова 1 (указатель инструкции) на интересующий вас код или
  • Настройте точку останова, чтобы пропустить строку кода, добавив выражение
thread jump --by (number of lines to be skipped)

Совет 6. Распечатайте собственное описание отладки для любого объекта.

Мы можем настроить описание отладки для любых объектов класса, используя протокол CustomDebugConvertible.

Совет 7. Следите за точкой останова

Это используется для наблюдения или наблюдения за любой переменной, когда ее значение установлено.

В приведенном выше примере мы установили точку останова на просмотре для переменной возраста человека. Всякий раз, когда в коде установлена ​​переменная возраста, срабатывает контрольная точка.

Прежде чем мы перейдем к отладке макета и ограничений, давайте сначала рассмотрим следующие моменты.

Команды режима Objective c

Псевдоним команд

Небезопасный

Пользовательский файл отладки

Команды режима Objective C

Некоторые API не являются общедоступными и могут использоваться только для отладки. Objective C является динамическим языком, поэтому эти API-интерфейсы можно вызывать в режиме Objective C.

Допустим, у вас есть простая иерархия представлений, и вам нужно распечатать описание отладки для представлений. Это альтернатива отладке визуального 3D-режима Xcode.

  • выражение -l objc - чтобы сообщить, что выражение отладчика должно оцениваться в объективном режиме c, даже если оно находится в быстром кадре.
  • O - это то же самое, что и po для печати описания.
  • [Рекурсивное описание ‘self.view’] - Необработанный ввод выражения.

Псевдоним команд

Допустим, некоторые команды используются часто, и мы можем упростить их набор с помощью псевдонима.

UnsafeBitcast

Альтернативный способ получить описание отладки для объекта, если известен его адрес в памяти. Это небезопасно, потому что вы должны указать правильный тип объекта.

unsafeBitcast (x: T, to: U.type)

Преимущество unsafebitcast в том, что он возвращает типизированный результат. Используя типизированный результат, мы можем вызывать его имена свойств и методы, а также изменять их.

CATransaction.flush ()

Чтобы отразить любое обновление макета UIElement в кадрах внутри буфера представления (экрана), следует использовать команду CATransaction.flush ().

Пользовательский файл отладки

Поскольку LLDB является сценарием с использованием Python, вы получаете полный доступ ко всем API-интерфейсам LLDB. Разработчики могут создать свой собственный файл Python для настройки команд отладки в соответствии с их потребностями. Мы можем импортировать этот файл в консоль Xcode и начать вводить наши собственные команды отладки.

Загрузите файл Apple .py для справки - https://developer.apple.com/sample-code/wwdc/2018/UseScriptsToAddCustomCommandsToLLDB.zip

Отладка макета и ограничений

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

  1. Посредством рекурсивного описания просмотра найдите адрес памяти всех подвидов.
  2. Чтобы распечатать описание отладки и получить результат типа, используйте команду unsafeBitcast.

3. Измените рамку или размер элемента пользовательского интерфейса, вызывающего проблему.

4. Чтобы отразить эти изменения на экране, проинформируйте отладчик, набрав выражение команды CATransaction.flush ()

5. Мы также можем обновлять константы в режиме отладки, не компилируя код снова и снова.

6. Обновите ограничения, обратившись к их адресам памяти в режиме визуальной отладки Xcode. Затем обновите его с помощью команды выражения и, наконец, вызовите команду выражения CATransaction.flush (), чтобы обновить кадры в буфере просмотра.

Вышеуказанные методы могут значительно сэкономить время для сложных проектов и иметь решающее значение для трудно воспроизводимых ошибок.

Ссылка - https://developer.apple.com/videos/play/wwdc2018/412/