programing

LLDB가 view.bounds를 인쇄 할 수없는 이유는 무엇입니까?

itsource 2021. 1. 18. 07:58
반응형

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) …

처음 세 번의 시도가 실패한 이유는 무엇입니까? 더 간단한 인쇄 방법이 self.bounds있습니까? 감사.


다음 방법으로 액세스 할 수 있습니다.

p (CGRect)[view bounds]

또는

p view.layer.bounds

view.bounds 실제로 view.layer.bounds

의 유형 정보를 [UIView bounds]사용할 수없는 것 같습니다.lldb


Xcode 6.3부터 더 나은 솔루션이 있습니다. 요컨대, LLDB 용 UIKit을 가져와야 다음 유형에 대해 알 수 있습니다 expr @import UIKit.. 체크 아웃 이 기사를 당신의 인생을 더 쉽게하기 위해 몇 가지 트릭을 배울 수 있습니다.


당신이 좋아하는거야 엑스 코드를 6.3+

TLDR

(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 비트 장치에서 실행할 때 가변 함수에 대한 액세스, 잠재적으로 잘못된 유추 인수 유형 제거 등이 있습니다.

추신 : 당신이 또한 p와 po를 혼동한다면

p == print == expression -- == e --
po == expression -O -- == e -O --

--command+flagvs 사이의 구분자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있음을 알아야합니다 . 이러한 컨텍스트에서 호출 할 수 있으므로 ObjC 유형 이라고 가정 할 수 없습니다 .selfboundsself

void test()
{
    struct 
    {
        int bounds;
    } self;
}

그래서 당신은 오류를 얻습니다 error: unsupported expression with unknown type

However, if you call it using [self bounds], lldb knows that self much be ObjC type because [] syntax only apply to ObjC type. But since the type of self is not clear, it still cannot evaluate the result of [self bounds] so you need to cast it to CGRect


Try with following expression,

p self.view.bounds.size.width

or use,

po self.view

p - Print is only uses to print normal/simple values while, po - Print Object works same as NSLog to print value of an object


I tried @an0's answer expr @import UIKit, but it didn't work.

Then I added a pch file, and add these lines of code in the file:

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif

#endif /* PrefixHeader_pch */    

Next, link the pch file to my project:

enter image description here

Run the app again, then I can use the dot notation in lldb console:

(lldb) po self.view.bounds    

For how to add a pch file , see the answer here PCH File in Xcode 6

ReferenceURL : https://stackoverflow.com/questions/18885255/why-cant-lldb-print-view-bounds

반응형