75

print someFloatVariableブレークポイントまたは を設定するときに入力できることはわかっていますpo [self someIvarHoldingAnObject]が、次のような便利なことはできません。

[self setAlpha:1];

次に吐き出します:

エラー: '[self' は有効なコマンドではありません。

奇妙なことは、私が呼び出すことができ、そのpo [self someIvarHoldingAnObject]説明を出力することです。

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

4

2 に答える 2

121

gdb と lldb コマンドの正規リファレンスはhttp://lldb.llvm.org/lldb-gdb.htmlです。

式を評価する expr コマンドを使用します。これは、引数に加えて「生の入力」を受け取る 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)

ところで、浮動小数点引数の問題をうまく回避する方法があります。クラスメソッドのプロトタイプを使用して、lldb に入力するすべての式に追加される「式プレフィックス」ファイルを作成します。たとえば、NSObject から継承するクラス MyClass があります。このクラスには、float ivar を設定および取得する "setArg:" と "getArg" という 2 つのメソッドがあります。これはばかげた小さな例ですが、使用方法を示しています。以下は、lldb 用に作成したプレフィックス ファイルです。

@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 *);
}

私の~/.lldbinitファイルに追加します

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

ここにもいくつかの標準 C ライブラリ関数が含まれていることに気付くでしょう。これを行った後、これらの戻り値の型をキャストする必要はもうありません。

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

(その「<結果なし>」の修正は、lldb TOT ソースに既にコミットされています。)

于 2012-10-11T00:21:15.300 に答える
9

複数行が必要な場合は、次を使用しますexpression

expression

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

// code will execute now

コードを終了して実行するための空白行。

于 2016-11-08T21:11:26.987 に答える