2012-10-10 14 views
54

は私がブレークポイントまたはpo [self someIvarHoldingAnObject]を設定すると、私はprint someFloatVariableを入力することができます知っているが、私はのような便利なものを行うことはできません。そして、LLDBデバッガでメソッドを呼び出したりコードを実行する方法は?

[self setAlpha:1]; 

それが吐き出す:

error: '[self' is not a valid command.

奇妙なことがあるというI po [self someIvarHoldingAnObject]に電話をかけると、その説明が印刷されます。

私は、実行時にコンソールからコードを実行する方法を実演した1年前のビデオを見たことがあると思います。もし私が間違っていないのであれば、引数とオブジェクトをポインタに割り当てました。どうやってするか?

+0

[lldb-for-gdb-users.txt](http://opensource.apple.com/source/lldb/lldb-69/docs/lldb-for-gdb-users)に例があります。txt)をC: 'expr(int)printf(" ... ")'に変換します。メソッド呼び出しの前に 'expr(type)'をつけるべきでしょうか? – osgx

答えて

85

GDB V。lldbコマンドの標準的な参照は、あなたが式を評価exprのコマンドを使用しますhttp://lldb.llvm.org/lldb-gdb.html

です。これは、引数に加えて "生の入力"を取るlldbコマンドの1つで、引数(expr)の終了位置とコマンドの開始位置を示すために " - "が必要なことがよくあります。例えば

(lldb) expr -- [self setAlpha:1] 

"p"というショートカットがありますが、あなたのために(ただし引数は許可されません)。

(lldb) p [self setAlpha:1] 

あなたが呼んでいる機能(複数可)あなたのプログラムの一部ではない場合、あなたは多くの場合、lldbはそれらを呼び出す方法を知っているので、明示的に戻り値の型を宣言する必要があります。例えば

(lldb) p printf("hi\n") 
error: 'printf' has unknown return type; cast the call to its declared return type 
error: 1 errors parsing expression 
(lldb) p (int)printf("hi\n") 
(int) $0 = 3 
hi 
(lldb) 

浮動小数点引数の問題BTWを回避するには、きちんとした方法があります。 lldbに入力するすべての式に追加される "式プレフィックス"ファイルを作成し、クラスメソッドのプロトタイプを作成します。例えば、私はNSObjectから継承するクラスMyClassを持っていますが、浮動小数点数を設定して取得する2つの関心のあるメソッド "setArg:"と "getArg"があります。これは愚かな小さな例ですが、それを使用する方法を示しています。私~/.lldbinitファイルに

@interface NSObject 
@end 
@interface MyClass : NSObject 
- init; 
- setArg: (float)arg; 
- (float) getArg; 
@end 

extern "C" { 
    int strcmp (const char *, const char *); 
    int printf(const char * __restrict, ...); 
    void puts (const char *); 
} 

あなたは私がのカップルを含め気づくでしょう、私は

settings set target.expr-prefix /Users/jason/lldb-prefix.h 

を追加し、今私は

(lldb) p [var getArg] 
(float) $0 = 0.5 
(lldb) p [var setArg:0.7] 
(id) $1 = 0x0000000100104740 
(lldb) p [var getArg] 
(float) $2 = 0.7 

を行うことができます。ここで私はlldbのために書いたプレフィックスファイルがあります標準的なCライブラリ関数もここにあります。これを実行した後で、これらのリターンタイプをこれ以上キャストする必要はありません。あなたは複数行が必要な場合は

(lldb) p printf("HI\n") 
<no result> 
HI 
(lldb) p strcmp ("HI", "THERE") 
(int) $3 = -12 

(。つまり、 "< >なし結果" 事はすでにlldbのTOTソースにコミットされているの修正)

+0

expr - [self setAlpha:0.5f]またはexpr - [self setAlpha:1]はどちらも問題のビューを画面から完全に消滅させます。何かが起こっているように見えるが、間違いなく正しいことではない。私はブレークポイントを設定するときにのみ、これらのコマンドを入力することができます。あるいは、コードがまだ実行されている/停止していない間に、このようなことをする方法はありますか? –

+0

いいえ、このメソッドを呼び出すときにプロセスを停止する必要があります。このセレクタが浮動小数点型を取る場合、Xcode 4.5のlldbで打撃を受けるかもしれない欠点があります - 関数の引数が浮動小数点型で、デバッグ情報がない場合、lldbは値を浮動小数点として渡します。これは、古いC言語のプロトタイプ引数のプロモーションルールに従って、無条件にdoubleとして渡します。 lldbがこのクラスのデバッグ情報を持っていれば、正しいことができるはずです。 ObjCプログラミングのこの問題の多くのインスタンスは、将来のリリースで修正される予定です。 –

+0

NB:float v。doubleという意味の問題を抱えている場合、setAlphaに渡す値は期待通りではなく、0に非常に近いランダムな見た目のクレイジーな数字になります。例えば。 –

2

expression使用:

expression 

do { 
    try thing.save() 
} catch { 
    print(error) 
} 

// code will execute now 

ブランクコードを実行して実行します。