web-dev-qa-db-ja.com

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を印刷する簡単な方法はありますか?ありがとう。

53
an0

Xcode 6.3以降、より良いソリューションがあります。つまり、LLDBのUIKitをインポートして、これらのタイプを知る必要があります:expr @import UIKitこの記事 をチェックして、あなたの人生をさらに楽にするいくつかのトリックを学んでください。

41
an0

あなたはそれにアクセスすることができます

p (CGRect)[view bounds]

または

p view.layer.bounds

view.boundsは実際にはview.layer.boundsです

[UIView bounds]の型情報はlldbでは利用できないようです

53
youfu

あなたが大好きになる Xcode 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ビットデバイス上で実行する場合の可変機能へのアクセス、潜在的に不正な推測引数タイプの排除が含まれます。

[〜#〜] ps [〜#〜]:pとpoも混同する場合

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

--は、command+flaginputsの間の区切り文字です

-Oフラグは、オブジェクトdescriptionメソッドを呼び出すためのものです

13
onmyway133

Xcode 6.3では、UIKitをインポートしてから、フレームまたはビューの境界を印刷できます

expr @import UIKit
p self.view.bounds
6
Ozgur Sahin

LLDBはpを使用する場合、メッセージ送信のドット表記をサポートしていません。そのためです。

p self.bounds

動作しませんが、

p [self bounds]

します。

(ただし、poを使用すると、オブジェクトに対して実際にサポートされます)

また、LLDBには実行時に利用できる非オブジェクトの型情報がないため、戻り値をキャストして明示的に型を指定する必要があります。

6

これを実行したときのコンテキストが何であったかはわかりません。しかし、lldbはselfのタイプを見つけることができないようです。

Lldbがself.boundsを評価するには、selfのタイプが何らかのクラスにプロパティboundsを持っていることを知る必要があります。 selfはObjC型であると想定することはできません。そのようなコンテキストで呼び出すことができるためです。

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

エラーerror: unsupported expression with unknown typeが発生します

ただし、[self bounds]を使用して呼び出すと、[]構文はObjC型にのみ適用されるため、lldbはselfがObjC型であることがわかります。ただし、selfの型は明確ではないため、[self bounds]の結果を評価することはできません。したがって、CGRectにキャストする必要があります。

0
Bryan Chen

次の式で試してください、

p self.view.bounds.size.width

または使用、

po self.view

p-印刷は、通常/単純な値の印刷にのみ使用されますが、po-オブジェクトの印刷は、オブジェクトの値を印刷するためにNSLogと同じように機能します

0
Bhavik Modi

@ an0の答えを試しましたexpr @import UIKit、しかし、うまくいきませんでした。

次に、pchファイルを追加し、次のコード行をファイルに追加します。

#ifndef PrefixHeader_pch
#define PrefixHeader_pch

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

#endif /* PrefixHeader_pch */    

次に、pchファイルをプロジェクトにリンクします。

enter image description here

アプリを再度実行すると、lldbコンソールでドット表記を使用できます。

(lldb) po self.view.bounds    

Pchファイルを追加する方法については、こちらの回答を参照してください Xcode 6のPCHファイル

0
wj2061