1

一部の iOS コードではstruct、オブジェクトに C ivar があります。この構造体のメンバーの 1 つはタイプdoubleです。メソッド内でこのメンバーに割り当てると、デバッガーは、(変数のリスト ビューと同様に) メンバー自体を出力するときにstruct、このメンバーの値に対して誤った値を報告しますが、メンバーを直接出力すると ( )、私は正しい値を取得します。さらに、このメンバーの値をローカルの自動変数に割り当てると、リスト ビューと印刷時に正しい値が表示されます。structstructstructp structWithDouble.doubleMemberdouble

これは LLDB の問題だと思いますが、不安でイライラします。これは既知の問題ですか? もしそうなら、回避策はありますか?

typedef struct {
    double doubleMember;
} structWithDouble;

@interface MyClass : NSObject {
    structWithDouble structAsIvar;
}
@end

@implementation

- (void)someMethod {
    structAsIvar.doubleMember = 200.0;
    double localDouble = structAsIvar.doubleMember;
}

内部someMethod:のデバッガ変数リストには、次の値が表示されます。

structAsIvar.doubleMember (double) 1.65865e-307
localDouble               (double) 200

LLDB に侵入すると、次の出力が得られますsomeMethod:

(lldb) p structAsIvar.doubleMember
(double) $4 = 200

(lldb) p structAsIvar
(structAsIvar) $5 = {
  (double) doublemember = 1.17244e-312
}

(lldb) p localDouble
(double) 200

(lldb) p self->structAsIvar.doubleMember
(double) 200

アップデート

GDB を使用している場合、このような動作は発生しないことがわかりました。どうやら LLDB はまだ準備ができていないようです...ただし、LLDB の回避策にはまだ興味があります。

4

1 に答える 1

0

これは、Xcode 4.5 の lldb (lldb-167.2) で修正されているようです。

(lldb)  p structAsIvar.doubleMember
(double) $5 = 200
(lldb)  p structAsIvar
(structWithDouble) $6 = {
  (double) doubleMember = 200
}
(lldb) p localDouble
(double) $7 = 200
(lldb) p self->structAsIvar.doubleMember
(double) $8 = 200
(lldb) 

どのリリースに修正があったか正確にはわかりません。Xcode 4.4も正しく動作する可能性がありますが、現在テストする手元にありません。

于 2012-09-30T06:38:11.790 に答える