Ответ 1
Начиная с Xcode 6.3, у нас есть лучшее решение. Короче говоря, вам нужно импортировать UIKit для LLDB, чтобы узнать об этих типах:
expr @import UIKit
. Проверьте эту статью, чтобы узнать некоторые трюки, чтобы сделать вашу жизнь еще проще.
Такие вещи, как это, приводят меня в замешательство при отладке:
(lldb) p self.bounds
error: unsupported expression with unknown type
error: unsupported expression with unknown type
error: 2 errors parsing expression
(lldb) p (CGRect)self.bounds
error: unsupported expression with unknown type
error: unsupported expression with unknown type
error: C-style cast from '<unknown type>' to 'CGRect' is not allowed
error: 3 errors parsing expression
(lldb) p [self bounds]
error: 'bounds' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
(lldb) p (CGRect)[self bounds]
(CGRect) $1 = origin=(x=0, y=0) size=(width=320, height=238)
(lldb) You suck!
error: 'You' is not a valid command.
(lldb) …
Почему первые 3 попытки потерпели неудачу? Есть ли более простой способ печати self.bounds
? Спасибо.
Начиная с Xcode 6.3, у нас есть лучшее решение. Короче говоря, вам нужно импортировать UIKit для LLDB, чтобы узнать об этих типах:
expr @import UIKit
. Проверьте эту статью, чтобы узнать некоторые трюки, чтобы сделать вашу жизнь еще проще.
Вы можете получить к нему доступ
p (CGRect)[view bounds]
или
p view.layer.bounds
view.bounds
на самом деле view.layer.bounds
Кажется, что информация о типе [UIView bounds]
недоступна lldb
Вы полюбите Xcode 6.3+
TL;DR
(lldb) e @import UIKit
(lldb) po self.view.bounds
LLDB Objective-C парсер выражений теперь может импортировать модули. Любые последующее выражение может основываться на прототипах функций и методов определенные в модуле:
(lldb) p @import Foundation
(lldb) p NSPointFromString(@"{10.0, 20.0}");
(NSPoint) $1 = (x = 10, y = 20)
До Xcode 6.3, методы и функции без отладочной информации требуемые явные приемы для указания их типа возврата. Импорт модули позволяют разработчику избегать более трудоемкого процесса определения и указания этой информации вручную:
(lldb) p NSPointFromString(@"{10.0, 20.0}");
error: 'NSPointFromString' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
(lldb) p (NSPoint)NSPointFromString(@"{10.0, 20.0}");
(NSPoint) $0 = (x = 10, y = 20)
Другие преимущества модулей импорта включают в себя улучшенные сообщения об ошибках, доступ к вариационным функциям при работе на 64-битных устройствах и устраняя потенциально неверные допустимые типы аргументов.
PS: Если вы также путаете p vs po
p == print == expression -- == e --
po == expression -O -- == e -O --
--
является разделителем между command+flag
vs inputs
-O
флаг предназначен для вызова метода description
LLDB не поддерживает точечную нотацию для отправки сообщений при использовании p
и что
p self.bounds
не работает, но
p [self bounds]
делает.
(Он фактически поддерживает его для объектов, когда вы используете po
, хотя)
Кроме того, LLDB не имеет информации о типе не-объектов, доступных во время выполнения, поэтому вам нужно явно указать тип, указав возвращаемое значение.
С Xcode 6.3 мы можем импортировать UIKit, а затем распечатать фрейм или рамку просмотра
expr @import UIKit
p self.view.bounds
Я не знаю, какой был контекст, когда вы запускаете это. Но похоже, что lldb не может найти тип self
.
Чтобы lldb оценил self.bounds
, ему нужно знать, что тип self
- это некоторый класс, имеющий свойство bounds
. Он не может считать, что self
является ObjC-типом, потому что вы можете назвать его в таком контексте:
void test()
{
struct
{
int bounds;
} self;
}
чтобы вы получили сообщение об ошибке error: unsupported expression with unknown type
Однако, если вы вызываете его с помощью [self bounds]
, lldb знает, что self
много будет ObjC-типом, потому что синтаксис []
применяется только к типу ObjC. Но так как тип self
не ясен, он все еще не может оценить результат [self bounds]
, поэтому вам нужно передать его в CGRect
Попробуйте следующее выражение,
p self.view.bounds.size.width
или используйте
po self.view
p - Печать используется только для печати обычных/простых значений в то время как, po - Объект печати работает так же, как NSLog для печати значения объекта
Я попробовал @an0 answer expr @import UIKit
, но это не сработало.
Затем я добавил файл pch и добавлю эти строки кода в файл:
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif
#endif /* PrefixHeader_pch */
Затем свяжите файл pch с моим проектом:
Запустите приложение еще раз, затем я могу использовать точечную нотацию в консоли lldb:
(lldb) po self.view.bounds
Как добавить файл pch, см. ответ здесь Файл PCH в Xcode 6