Как изменить значение переменных при отладке с LLDB в Xcode?

173

В XCode GDB позволяет вам изменять локальные переменные во время отладки (смотрите, как изменить значение NSString при отладке в XCode? ). LLDB предлагает аналогичную функциональность? Если так, как мы можем использовать это?

Эрик
источник
1
Убедитесь, что вы видите расширенную отладку в iOS . Это потрясающе
Милая
Я пытаюсь установить свойство объектов, которое работает, если длина строки составляет от 0 до 15 символов. Установка строки из 16 или более символов принята, но когда я ее печатаю обратно, она показывает мне бессмысленную строку: po myObj.someString = "1234567890123456", которая работает, но когда я печатаю, я получаю (String? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Ник Райт

Ответы:

267
expr myString = @"Foo"

(lldb) help expr
Оценивает выражение C / ObjC / C ++ в контексте текущей программы, используя переменные, находящиеся в настоящее время в области видимости. Эта команда принимает необработанный ввод (не нужно заключать в кавычки).

Синтаксис: выражение -

Параметры команды Использование: выражение [-f] [-G] [-d] [-u] - выражение [-o] [-d] [-u] - выражение

   -G <gdb-format>  ( --gdb-format <gdb-format> )
        Specify a format using a GDB format specifier string.

   -d <boolean>  ( --dynamic-value <boolean> )
        Upcast the value resulting from the expression to its dynamic type
        if available.

   -f <format>  ( --format <format> )
        Specify a format to be used for display.

   -o  ( --object-description )
        Print the object description of the value resulting from the
        expression.

   -u <boolean>  ( --unwind-on-error <boolean> )
        Clean up program state if the expression causes a crash, breakpoint
        hit or signal.

Примеры:

expr my_struct-> a = my_array [3]
expr -f bin - (index * 8) + 5
expr char c [] = "foo"; с [0]

ВАЖНОЕ ПРИМЕЧАНИЕ: Поскольку эта команда принимает «необработанный» ввод, если вы используете какие-либо параметры команды, вы должны использовать «-» между концом параметров команды и началом необработанного ввода.

«expr» - это сокращение от «expression»

Матиас Баух
источник
1
Действительно, спасибо! Еще один маленький вопрос: я делаю это, чтобы попытаться изменить текст UILabel: 'expr myLabel.text = @"hello!"но я получаю error: property 'text' not found on object of type 'UILabel *'... Есть мысли?
Эрик
10
expr (void)[label setText:@"Foo"]должен сделать это. Dot-синтаксис обычно не работает в отладчике. lldb, вероятно, интерпретирует это так, как вы хотели получить доступ к члену c-struct, но я не уверен, что по этой причине это не сработает. Dot-синтаксис не работает poни для одного. вместо po label.textтебя надо использоватьpo [label text]
Матиас Баух
4
На самом деле, lldb обрабатывает точечный синтаксис намного лучше, чем gdb. GDB просто предполагает, что вы относитесь к нему как к C-struct, что не удается. lldb будет правильно обращаться к свойствам, но только если они действительно объявлены с @property.
Би Джей Гомер
28
Вы также можете использовать pв качестве ярлыка для expr. Пример:(lldb) p url = @"http://google.com"
funroll
11
Вы также можете использовать eв качестве ярлыка для expr. Кстати, pэто псевдоним для печати, который является псевдонимом expr --(просто оценивает необработанный ввод, без флагов) expr -o -- [object]или, poкак правило, дает более полезный вывод для объектов.
Джейсон Ньюэлл
21

Следующий материал работает для меня. Я использую Xcode 8.

Если вы хотите установить некоторую переменную (например, «dict») в ноль, а затем протестировать поток кода, вы можете попробовать следующее.

  1. Правильно установите точку останова после инициализации до желаемого значения.
  2. затем выполните «выражение dict = nil» в командной строке lldb, чтобы изменить его. (например "ноль")
  3. Переступите через точку останова.
  4. Проверьте переменную «dict» в следующей строке. Это будет ноль.

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

(lldb) expression dict = nil
(NSDictionary *) $5 = nil
arango_86
источник
3

Если вы используете Xcode 10 или 11, правильно установите точку останова после инициализации в требуемую переменную, тогда вы можете po myString = "Hello World"легко изменить ее, используя .

atalayasa
источник