2011-01-28 5 views
45

Я работаю над приложением для iPhone. Я полный разработчик Java, и я привык использовать Eclipse, где я могу поставить точку останова и остановить процесс. Затем я могу ввести любое выражение, которое я хочу, и Eclipse будет оценивать его, используя значения из этой точки процесса.Xcode оценивает выражения во время отладки

Есть ли способ сделать это в Xcode? Я хочу иметь возможность остановиться на точке останова, а затем ввести код для его оценки. Консоль gdb позволит мне сделать po (print-object), но она действительно ограничена. Любая помощь?

+0

Что такое «по»? Консоль gdb позволит вам оценить большой набор произвольных функций. Что конкретно вы пытаетесь сделать? –

+3

"po" - это объект печати. Это расширение Apple для gcc, что приводит к тому, что сообщение * description * отправляется экземпляру ObjC, чтобы он возвращал его описание. – diciu

+0

А, вот почему я не слышал об этом. Весело. –

ответ

40

Моя практика:

po [NSUserDefaults standardUserDefaults]

дисплеи: < NSUserDefaults: 0x6143040>

po [[NSUserDefaults standardUserDefaults] stringForKey:@"Currency"]

отображает: "CHF"

+3

Это единственный ответ, который фактически отвечает на вопрос. Питер предлагает вам использовать команду 'po' в приглашении' (lldb) ', которое доступно на консоли отладки, когда выполнение было приостановлено точкой останова отладчика. Оригинальный плакат указывает, что они уже используют 'po', но, по крайней мере, это попытка ответить на вопрос. –

+1

По крайней мере, это ответ –

3

Не является swering вопрос о Xcode, но JetBrains 'AppCode делает это стандартным способом IDE, который большинство из нас знает с других платформ.

+0

Это не отвечает на вопрос о Xcode, но нет ничего плохого в руководстве на другой IDE. Спасибо. –

14

Используйте команду «выражение» в отладчике. Использование этого относительно просто. Просто введите командное выражение и нажмите enter. Затем вам будет предложено ввести выражение. Вот пример

(lldb) expression 
Enter expressions, then terminate with an empty line to evaluate: 
2+2 

(int) $2 = 4 

Я также приложил справочную информацию для команды выражения ниже. Надеюсь это поможет.

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

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

Опции команды Использование: выражение [-f] [-G] [-a] [-d] [-t] [-u] - выражение [-o ] [-a] [-d] [-t] [-u] - выражения

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

    -a <boolean> (--all-threads <boolean>) 
     Should we run all threads if the execution doesn't complete on one 
     thread. 

    -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. 

    -t <unsigned-integer> (--timeout <unsigned-integer>) 
     Timeout value for running the expression. 

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

таймаутов: Если выражение может быть оценено статический (без стереосистемы и обновите код), то он будет. В противном случае по умолчанию выражение будет выполняться в текущем потоке с коротким таймаутом: в настоящее время .25 секунд. Если он не вернется в это время, оценка будет прервана и возобновлена ​​при всех потоках. Вы можете использовать опцию -a, чтобы отключить повторную попытку для всех потоков . Вы можете использовать опцию -t, чтобы установить более короткий тайм-аут.

Определенные пользователем переменные: Вы можете определить свои собственные переменные для удобства или использоваться в последующих выражениях. Вы определяете их так же, как вы определяете переменные в C. Если первый символ , ваша определяемая пользователем переменная равна $, тогда значение переменной будет доступно в будущих выражениях , в противном случае оно будет доступно только в текущем выражении ,

Примеры:

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

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

63

В XCode 4.0 это похоже на скрытый в графическом интерфейсе. Когда вы находитесь в точке останова, вы, возможно, увидите представление переменных в области отладки; это панель, которая показывает локальные переменные и т. д. Щелкните правой кнопкой мыши на представлении переменных и выберите «Добавить выражение ...»

Я понимаю, что это старый поток, но он по-прежнему является лучшим хитом Google, поэтому я счел нужным ответить.

+0

Это ответ, который сейчас актуальен. Спасибо –

+0

Ницца! Не могу поверить, что этот вариант скрыт настолько глубоко –

+2

Это заслуживает большего количества голосов! –

Смежные вопросы