Почему LLDB не может печатать view.bounds? - программирование
Подтвердить что ты не робот

Почему LLDB не может печатать view.bounds?

Такие вещи, как это, приводят меня в замешательство при отладке:

(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? Спасибо.

4b9b3361

Ответ 1

Начиная с Xcode 6.3, у нас есть лучшее решение. Короче говоря, вам нужно импортировать UIKit для LLDB, чтобы узнать об этих типах: expr @import UIKit. Проверьте эту статью, чтобы узнать некоторые трюки, чтобы сделать вашу жизнь еще проще.

Ответ 2

Вы можете получить к нему доступ

p (CGRect)[view bounds]

или

p view.layer.bounds

view.bounds на самом деле view.layer.bounds

Кажется, что информация о типе [UIView bounds] недоступна lldb

Ответ 3

Вы полюбите 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

Ответ 4

LLDB не поддерживает точечную нотацию для отправки сообщений при использовании p и что

p self.bounds

не работает, но

p [self bounds]

делает.

(Он фактически поддерживает его для объектов, когда вы используете po, хотя)

Кроме того, LLDB не имеет информации о типе не-объектов, доступных во время выполнения, поэтому вам нужно явно указать тип, указав возвращаемое значение.

Ответ 5

С Xcode 6.3 мы можем импортировать UIKit, а затем распечатать фрейм или рамку просмотра

expr @import UIKit
p self.view.bounds

Ответ 6

Я не знаю, какой был контекст, когда вы запускаете это. Но похоже, что 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

Ответ 7

Попробуйте следующее выражение,

p self.view.bounds.size.width

или используйте

po self.view

p - Печать используется только для печати обычных/простых значений в то время как, po - Объект печати работает так же, как NSLog для печати значения объекта

Ответ 8

Я попробовал @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