2010-06-03 10 views
8

pracując nad projektem mac os (nie oznaczającym iPhone'a) wymagającym 10.6 i 64-bitowym, pozwala mi używać właściwości do generowania zarówno metod dostępu, jak i zmiennych instancji w pliku nagłówkowym. ale podczas debugowania nie widzę sposobu, aby spojrzeć na wartości właściwości obiektu po ich wypełnieniu. czy jest jakieś ustawienie kompilacji, które należy włączyć?xcode 3.2.2 i cel-c 2.0 i debugowanie: gdzie są wartości zmiennych obiektu/instancji mojego obiektu w debugowaniu?

jeśli deklaruję zmienne instancji obiektu (pomiędzy {} w nagłówku), to widzę te wartości (gdy są używane) podczas debugowania w oknie debugowania lub za pomocą wskaźnika myszy nad kursorem podświetlona sztuczka liniowa w edytorze podczas przerwy lub przez wykonanie cli w gdb jak np. "obiekt p *".

stary sposób:

@class Suit; 
@interface Card : NSObject 
{ 
    NSNumber *playOrder; 
    Suit *suit; 
    NSNumber *displayNumber; 
    NSNumber *orderIndex; 
} 
@property(nonatomic, retain) Suit *suit; 
@property(nonatomic, retain) NSNumber *displayNumber; 
@property(nonatomic, retain) NSNumber *orderIndex; 

nowy sposób:

@class Suit; 
@interface Card : NSObject 

@property(nonatomic, retain) Suit *suit; 
@property(nonatomic, retain) NSNumber *displayNumber; 
@property(nonatomic, retain) NSNumber *orderIndex; 
@property(nonatomic, retain) NSNumber *playOrder; 

w tej nowej fangled 10,6 wymaganej 64bit idei (co wydaje się prostsze do mnie) żadna z tych metod debugowania wyświetlania wartości obiektu. Myślę, że muszę mieć coś wyłączonego, ponieważ ten nowszy pomysł nie wydaje się lepszy.

wyniki GDB dla staremu:

(gdb) po newCard 
New Card : 0 of Suit : Hearts (NSCalibratedRGBColorSpace 1 0 0 1). with orderIndex of: 1 
(gdb) p *newCard 
$1 = { 
    <NSObject> = { 
    isa = 0x100002188 
    }, 
    members of Card: 
    playOrder = 0x0, 
    suit = 0x200053a20, 
    displayNumber = 0x20001bac0, 
    orderIndex = 0x200012de0 
} 
(gdb) 

wyniki GDB na nowy sposób:

(gdb) po newCard 
New Card : 0 of Suit : Hearts (NSCalibratedRGBColorSpace 1 0 0 1). with orderIndex of: 1 
(gdb) p *newCard 
$3 = { 
    <NSObject> = { 
    isa = 0x100002188 
    }, <No data fields>} 
(gdb) 

więc patrząc na docs dla Objective-C 2.0:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW3

opisuje, co mam na myśli (syntetyzując zmienne instancji w 'nowoczesnym' r untime), ale to, co nigdzie nie jest powiedziane, oznacza, że ​​jeśli to zrobisz, wartości nie będą dostępne podczas debugowania.

Znalazłem się SO stronę z istotnych informacji, ale nie skupia się na tym celu: Using instance variables with Modern Runtime

co mnie ominęło?

+0

Czy to możliwe, że włączyłeś kolekcję Garbace? Spróbuj wyłączyć tę funkcję i sprawdź, czy debugger znajduje się na polach. –

+0

yes garbage collection is on w obu przykładowych testach. – lulu

Odpowiedz

2

W GDB, można użyć aby uzyskać dostęp pobierające własności dynamicznych Ivars:

 
(gdb) po [newCard displayNumber] 
0 
+0

outis, dziękuję za odpowiedź. to jest to, czego potrzebowałem. utknąłem w myśleniu, że powinienem użyć new card.displayNumber (składnia nut dot), a kiedy to nie zadziałało, powinienem użyć p * newCard i postępować zgodnie z tym wynikiem. potem utknąłem, nie widząc żadnego użytecznego wyniku z tego. – lulu

2

Zakładam, że jesteś @synthesizing tych zmiennych?

Możesz również potrzebować { } w interfejsie, aby kompilator wiedział, gdzie ją umieścić.

@interface Card : NSObject 
{ 

} 

Unikałbym tego rodzaju składni ... szczególnie jeśli sam zdefiniujesz właściwości.

Sprawdź również, czy możesz wydrukować listę ivars dla klasy. Cały czas używam tych metod do debugowania metod lub klas z API, które nie mają dokumentacji.

unsigned int total_method_count = 0; 
    Method * method_list = class_copyMethodList(object_getClass([obj class]), &total_method_count); 
    @try 
    { 
     int method_counter = 0; 
     for (method_counter = 0; method_counter < total_method_count; method_counter++) 
     { 
      Method method = method_list[method_counter]; 
      // check if method the KVC getter you are interested in 
      NSLog(@"Method: %s", sel_getName(method_getName(method))); 
     } 
    } @catch (NSException *e) { 
     //Do Nothing 
    } 
+0

Tak, plik .m ma @synthesize dla właściwości w obu przykładach. co do używania '{}' w drugim przykładzie, używam idei, że jeśli projekt jest ustawiony na 64-bitowy i wymaga uruchomienia 10.6, wtedy można zsyntetyzować zmienne instancji i "{}" niekoniecznie. w związku z tym moje ekstremalne zaskoczenie nie znajduje żadnych danych do użycia w debugowaniu, więc na pewno mam coś nie tak. Wypróbuję Twój kod i zgłoś go ponownie. dzięki, stephen. – lulu

+0

Widzę, gdzie powyższy pomysł może być pomocny, a także użycie funkcji nagłówka środowiska wykonawczego w debugowaniu jako strategii i prawdopodobnie pomoże także innym osobom. o co pytam, to że wydaje się, że jeśli użyję syntezowanych ivars w tworzeniu projektów, które są 64-bitowe, 10.6 runtime, to nie widzę debugowania odwołań do danych, i dla mnie, to wydaje się takie dziwne, (aby nie móc korzystać z debugowania gdb lub xcode), na pewno coś mi brakuje w mojej konfiguracji. więc to jest podstawa mojego pytania: "co przegapiłem?". – lulu

+0

Wszystko o czym mówiłem, to fakt, że kompilator może wcale nie generować ivars. Dlatego należy używać środowiska wykonawczego, aby upewnić się, że są generowane, a nie tylko polegać na gdb lub debugerze XCode. Ponadto, ponieważ kompilator nie robi nic inteligentnego, możesz dodać '{}', aby upewnić się, że kompilator wie, gdzie umieścić ten kod. Niestety, o ile mogę ci pomóc. Jeśli nie możesz zobaczyć twoich ivarów za pomocą runtime.h, to "nowa" droga to po prostu garść koni-malarka i nigdy nie powinieneś nigdy używać tak niewidocznej składni. –

2

miałem ten sam problem z syntetyzowanych Ivars. Moim rozwiązaniem było przejście do kompilatora LLVM 1.6 w XCode 3.25.Spowoduje to wyświetlenie podpowiedzi do debuggera (co jest dla mnie najbardziej przydatne), ale okno zmiennych wciąż nie pokazuje wartości ivars.