Як змінити значення змінних під час налагодження LLDB в Xcode?


173

У Xcode GDB дозволяє змінювати локальні змінні під час налагодження (див. Як змінити значення NSString під час налагодження в XCode? ). Чи пропонує LLDB подібний функціонал? Якщо так, то як ми можемо ним користуватися?


Переконайтеся, що бачите розширені налагодження в 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) допоможе 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 - (індекс * 8) + 5
expr char c [] = "foo"; c [0]

ВАЖЛИВА ПРИМІТКА. Оскільки ця команда приймає "необроблений" вхід, якщо ви використовуєте будь-які параметри команд, ви повинні використовувати "-" між кінцем параметрів команди та початком вихідного вводу.

'expr' - це абревіатура для 'express'


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-структури, але я не впевнений, чи це причина, що вона не працюватиме. Dot-Syntax не працює poні для одного. замість цього po label.textвам доведеться скористатисяpo [label text]
Маттіас Бауч

4
Насправді, lldb обробляє кращий синтаксис набагато краще, ніж gdb. gdb просто припускає, що ви ставитесь до цього як до C-структури, яка не працює. lldb вірно отримає доступ до властивостей, але лише якщо вони фактично оголошені @property.
BJ Гомер

28
Ви також можете використовувати pяк ярлик для expr. Приклад:(lldb) p url = @"http://google.com"
funroll

11
Ви також можете використовувати eяк ярлик для expr. BTW 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

3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.