Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't LLDB print view.bounds?

Things like this drive me crazy when debugging:

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

Why did the first 3 attempts fail? Is there any simpler way to print self.bounds? Thanks.

like image 894
an0 Avatar asked Sep 19 '13 02:09

an0


5 Answers

You can access it by

p (CGRect)[view bounds]

or

p view.layer.bounds

view.bounds is actually view.layer.bounds

It seems that the type info of [UIView bounds] is not available to lldb

like image 132
youfu Avatar answered Nov 05 '22 13:11

youfu


Starting from Xcode 6.3, we have a better solution. In short, you need to import UIKit for LLDB to know about these types: expr @import UIKit. Check out this article to learn some tricks to make your life even easier.

like image 40
an0 Avatar answered Nov 05 '22 13:11

an0


You gonna love Xcode 6.3+

TLDR

(lldb) e @import UIKit
(lldb) po self.view.bounds

LLDB's Objective-C expression parser can now import modules. Any subsequent expression can rely on function and method prototypes defined in the module:

(lldb) p @import Foundation
(lldb) p NSPointFromString(@"{10.0, 20.0}");
(NSPoint) $1 = (x = 10, y = 20)

Before Xcode 6.3, methods and functions without debug information required explicit typecasts to specify their return type. Importing modules allows a developer to avoid the more labor-intensive process of determining and specifying this information manually:

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

Other benefits of importing modules include better error messages, access to variadic functions when running on 64-bit devices, and eliminating potentially incorrect inferred argument types.

PS: If you also confuse p vs po

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

-- is the separator between command+flag vs inputs

-O flag is for invoking the object description method

like image 23
onmyway133 Avatar answered Nov 05 '22 11:11

onmyway133


With Xcode 6.3, we can import UIKit and then print the frame or bound of view

expr @import UIKit
p self.view.bounds
like image 32
Ozgur Sahin Avatar answered Nov 05 '22 13:11

Ozgur Sahin


LLDB does not support dot notation for message sending when using p and that's why

p self.bounds

doesn't work, but

p [self bounds]

does.

(It actually supports it for objects when you use po, though)

Also, LLDB doesn't have type information of non-objects available at runtime, so you need to explicitly provide a type by casting the return value.

like image 22
Gabriele Petronella Avatar answered Nov 05 '22 12:11

Gabriele Petronella