LLDB Как использовать определенный макрос в OC - PullRequest
0 голосов
/ 17 февраля 2020

Я пробовал несколько вариантов этого, но ни один из них, похоже, не работает. Любые идеи?

в ViewController.m

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 200, 300, 300)];
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1];

Другой файл UIView+Frame.h Я определил цветовой макрос

#define RGBACOLOR(r,g,b,a) [UIColor colorWithRGB:r Green:g Blue:b Alpha:a]

Фактическая операция Когда программа выполняется [self.view addSubview: view1]; Я собираюсь использовать LLDB, чтобы использовать определенные макросы для изменения цвета, но он выдает ошибку, и я не знаю, как ее изменить. Неправильный результат выглядит следующим образом

(lldb) e view1.backgroundColor = (UIColor *)RGBACOLOR(0,0,0,1)
error: use of undeclared identifier 'RGBACOLOR'
(lldb) 

1 Ответ

1 голос
/ 18 февраля 2020

Макросы традиционно плохо поддерживаются отладочной информацией. Стандарт DWARF (который является наиболее распространенным в macOS и других Unixen) имеет способ хранения информации, но он настолько многословен, что лишь немногие наборы инструментов поддерживают его. Поэтому отладчику нет естественного способа узнать об определениях.

Если у вас есть небольшое количество достаточно независимых макросов, которые вы хотите использовать в выражениях отладки, вы можете поместить их в файл .h и установить файл как "префикс выражения lldb". Это будет включено в источник каждого выражения, которое вы запускаете впоследствии. Сделайте это:

(lldb) settings set target.expr-prefix ~/my-common-defines.h

Вы не можете быть слишком амбициозными (например, #include <unistd.h> не будет работать). Проблема в том, что большинство системных заголовочных файлов обусловлено набором других #defines. lldb не знает, каковы их значения, поэтому в какой-то момент предварительная обработка префикса expr завершится неудачей.

В качестве альтернативы, в clang также есть концепция под названием «модули», которая представляет собой попытку собрать коллекцию заголовков из какой-то пакет более общедоступен для повторной компиляции. На самом деле он собирает некоторую информацию, которая может привести к сбою синтаксического анализа expr-prefix. Поэтому, если макрос, к которому вы хотите получить доступ, находится в наборе заголовков, встроенных в модуль Clang, вы можете импортировать модуль в контекст выражения lldb, и это также сделает определения из модулей доступными. Например,

(lldb) expr -l obj c - @import Foundation

сделает доступными все определения макросов Foundation.

Аналогично, если ваш Заголовки являются модульными (эта страница углубленно описывает, что это означает:

https://clang.llvm.org/docs/Modules.html

), затем вы можете импортировать созданный вами модуль, и он определяет будет доступен парсеру выражений.

...