2013-07-15 2 views
2

Я новичок в LLDB и попробую ознакомиться с этими командами в official website.
Я сбиваю с толку о функции fr v bar и p bar.
Как вы можете видеть на веб-сайте, они описываются как «Показывать содержимое локальной переменной« bar »и помещать туда же. Но когда я положил их в реальное использование в Xcode 4.6.4, есть некоторые отличия?LLDB COMMAND: 'fr v var' vs 'p var'

(lldb) fr v self 
(FGPLoginViewController *const) self = 0x07566350 
(lldb) p self 
(FGPLoginViewController *) $0 = 0x07566350 
(lldb) fr v self.initCount 
error: "self" is a pointer and . was used to attempt to access "initCount". Did you mean "self->initCount"? 
(lldb) p self.initCount 
(NSInteger) $1 = 0 

initCount является свойством NSInteger из FGPLoginViewController.
И мои вопросы - вот какие реальные различия между fr v bar и p bar?

ответ

3

Разница (как я понимаю) является то, что frame variable только для печати содержимое переменных, тогда как print это ярлык для expression -- и может оценить произвольную C и Objective-C выражений.

В вашем примере self.initCount - синтаксис свойства [self initCount]. Чтобы оценить это выражение, отладчик компилирует его и выполняет код в контексте приложения .

Другой пример: p 2+3 вычисляет сумму и печатает результат, но fr v 2+3 приводит сообщение об ошибке.

С другой стороны, frame variable имеет гораздо больше возможностей для отображения переменных. Например, fr v -r "app.*" показывает все переменные, начиная с "app". Вы не можете сделать это командой print.

Подводя итог: frame variable для переменных и print (или expr) предназначен для выражений. В случае одна переменная они оба работают одинаково хорошо.

+0

Таким образом, '' функции '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', чтобы сделать его более ясным и более указанным? – kukushi

+0

@nekoP: Я обновил ответ и попытался объяснить его лучше. –

+0

Получил! Благодаря! – kukushi

0

1.В LLDB, p - печать, а po - объект печати. 'p' используется для печати переменных без указателя, таких как bool, float и т. д. 2.'fr v bar 'означает отображение содержимого локальной переменной (рамки).

0

BTW, для любителей gdb, команда print делает в значительной степени то, что сделала команда gdb print. Команда frame variable --no-locals эквивалентна команде gdb info args, frame variable --no-args эквивалентна info locals, а target variable делает то, что info variables сделал.

Jason правильно относится к истории, но эти команды также полезны, например, в командах останова, где вы хотите распечатывать все локали или аргументы каждый раз, когда вы останавливаете. Написание печатных выражений для всех из них было бы утомительным, но frame var даст вам все их одним ударом.

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