2009-06-10 14 views
30

Mam proste pytanie dotyczące debugowania w Xcode i GDB.Jak mogę sprawdzić obiekt w debugerze Xcode?

często napotkasz błąd:

unrecognized selector sent to instance 0x1081ad0 

co sprawia, że ​​obciążenie programu do GDB. Czy istnieje prosty sposób sprawdzenia, jaka instancja znajduje się w tej pamięci z GDB?

Odpowiedz

42

po 0x1081ad0

PO = Drukuj obiektu. Można nawet wywoływanie metod, jak

po [myArray objectAtIndex:0]

Zauważ, że to działa tylko na obiektach, więc

po 1

rozbije swój program.

+7

"Po 1" nie zawiesza twojego programu - gdb jest mądrzejszy. Po prostu wydrukuje komunikat o błędzie. –

+10

Pamiętaj również, aby wydrukować rzeczy nieobiektowe (np. Int), tylko nas, p, np. "P 1" – RickDT

+1

gdzie możesz to napisać? – chwi

6

Jest kilka rzeczy, które możesz zrobić.

  1. Można wstawić punkt załamania, które wyzwoli za każdym razem masz wyjątek, więc w zasadzie utworzyć punkt przerwania na to (przejdź do pułapki i utworzyć nową): - [NSException raise]
  2. Alternatywnie, można rzeczywiście zobaczyć, co przedmiot w tej lokalizacji jest mem:

    informacji symbol 0x1081ad0 lub

    infolinia * 0x1081ad0

Więcej informacji pod numerami cocoadev wiki entry for exceptionhandling i debugging tips for objective C at cocoawithlove.

9

Steven jest poprawna - komenda gdb po jest skrótem dla print-object, które faktycznie wywołuje -debugDescription (nie -description, jak można się spodziewać) na obiekcie przewidziany jako argument. W wielu przypadkach zobaczysz ten sam wynik z obu metod, ponieważ jeden wywołuje drugi, chyba że zostanie zastąpiony. (Patrz powiązany . UWAGA: objaśnienie na this Apple technote szczegółowe informacje Należy pamiętać, że w ich próbki kodu po $r3 drukuje zawartość rejestru PowerPC, ale można użyć dowolnego obiektu wskaźnik/odniesienia, w tym rejestrów Intel, etc.)

Pamiętaj też, że print-object działa tylko na prawidłowych obiektach, które nie zostały zwolnione. Nie pomoże to wcale, jeśli wysyłasz wiadomość do zakorkowanego wskaźnika. Biorąc pod uwagę błąd, który cytujesz, wydaje się, że jest to poprawna instancja obiektu, ale nie implementuje metody, którą chcesz wywołać.

Możliwe jest również, że obiekt został już zniszczony. This answer powinien pomóc w tym przypadku.


Edit:

Istnieją inne sposoby, aby "zbadać" obiektów w debugger.Zapytałem o kodery danych Xcode, this SO question, w ten sposób można określić, w jaki sposób klasa niestandardowa pojawia się w kolumnie Podsumowanie debuggera. Dokumentacja powiązana z tym pytaniem wyjaśnia, jak to działa. Znalazłem podejście podsumowujące, które bardzo pomaga przy obserwowaniu stanu obiektu.

0

Twoja instancja jest nieprawidłowa. Zwolniłeś obiekt w innym miejscu, ale nie wyczyściłeś wskaźnika ... Włącz wykrywanie Zombie.

Powiązane problemy