0

をデバッグしていUIProgressViewます。具体的には、 と を呼び出し-setProgress:-setProgress:animated:います。

次を使用してLLDBで呼び出すと:

p (void) [_progressView setProgress:(float)0.5f]

progressView の進行状況の値は 0 になります。どうやら、LLDB は float 値を正しく解析していません。

float 引数を LLDB で正しく解析する方法を教えてください。

ところで、GDB で同じ問題が発生しています。

4

2 に答える 2

1

Xcode 4.5 以前では、これは一般的な問題でした。私の記憶が正しければ、そこで実際に起こっていたのは、古い C の非プロトタイプ型プロモーション規則が有効だったということです。浮動小数点値を渡す場合、その型は double でした。整数値を渡す場合は、int として渡されました。そのようなものです。(float)0.8f と記述した場合、lldb は (float) の 4 バイトを取得し、8 バイトを読み取って double として解釈するものに渡します。

Xcode 4.6 では、可能であれば、lldb は Objective-C ランタイムから引数の型を取得するため、引数が実際にここで float を取得していることを認識します。(float) キャストさえ必要ないはずです。

私の推測では、lldb に object へのポインターを与えるp (void) [0x260da630 setProgress:...と、式パーサーはオブジェクトの isa を調べてクラスを取得し、型を取得していません。オブジェクト アドレスにキャストを追加するとすぐに、型が取得されます。

あなたが gdbについて書いたときsetProgress:(float)0.8f、これはこの引数が float 型であることを特別に示していると思われると思います。つまり、あなたはプロトタイプを提供していたのです。これは、lldb の式パーサーが将来的に行うべきことだと思いますが、すべての式の解析に clang が使用されているという事実は、これらの非標準的な意味をそれに押し込むのが少し難しいことを意味します。(もちろん、すでにいくつかあります。たとえば、p $r0作品;)

于 2013-03-22T03:01:26.747 に答える
0

問題が見つかりました。実際には、私の LLDB コマンドは少し異なって見えました:

p (void) [0x260da630 setProgress:(float)0.8f animated:NO]

0x260da630私のUIProgressViewはどこですか。どうやら、デバッガーは受信オブジェクトの正確な型を本当に知る必要があり、引数のキャストを尊重しないため、

p (void) [(UIProgressView*)0x260da630 setProgress:(float)0.8f animated:NO]

動作します。(へのキャストでidも十分ではありませんでした!)

Martin R と Martin Ullrich のコメントに感謝します。

ところで、住所の代わりにプロパティも使用していたことを誓います。しかし、おそらく Xcode を再起動することも役に立ちました…</p>

于 2013-03-20T19:27:03.313 に答える