Why can't LLDB print view.bounds?

后端 未结 8 2086
离开以前
离开以前 2020-12-23 16:02

Things like this drive me crazy when debugging:

(lldb) p self.bounds
error: unsupported expression with unknown type
error: unsupported expression with unkno         


        
相关标签:
8条回答
  • 2020-12-23 16:44

    I don't know what was the context when you running this. But looks like lldb cannot find the type of self.

    In order for lldb to evaluate self.bounds, it need to know the type of self is some Class has property bounds. It cannot assume self is ObjC type because you may call it under such context:

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

    so you get the error 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

    0 讨论(0)
  • 2020-12-23 16:46

    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

    0 讨论(0)
  • 2020-12-23 16:46

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

    expr @import UIKit
    p self.view.bounds
    
    0 讨论(0)
  • 2020-12-23 16:53

    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.

    0 讨论(0)
  • 2020-12-23 16:53

    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:

    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

    0 讨论(0)
  • 2020-12-23 16:59

    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

    0 讨论(0)
提交回复
热议问题