2009-06-10 5 views
30

Ich habe eine einfache Frage zum Debuggen auf Xcode und GDB.Wie sehe ich ein Objekt in Xcode Debugger?

Ich laufe oft in einen Fehler:

unrecognized selector sent to instance 0x1081ad0 

, die das Programm laden GDB macht. Gibt es eine einfache Möglichkeit zu untersuchen, welche Instanz sich in diesem Speicher von GDB befindet?

Antwort

42

po 0x1081ad0

po = Objekt drucken. Sie können auch Methoden aufrufen, wie

po [myArray objectAtIndex:0]

Beachten Sie, dass es nur auf Objekte funktioniert, so

po 1

wird Ihr Programm zum Absturz bringen.

+7

"po 1" wird Ihr Programm nicht zum Absturz bringen - gdb ist schlauer als das. Es wird nur eine Fehlermeldung gedruckt. –

+10

Beachten Sie auch, um nicht-Objekt Zeug (wie ein int) zu drucken, nur uns p, wie 'p 1' – RickDT

+1

wo können Sie das schreiben? – chwi

6

Es gibt ein paar Dinge, die Sie tun können.

  1. Sie können einen Haltepunkt einfügen, die jedes Mal, wenn Sie eine Ausnahme haben auslösen, erzeugen also im Grunde einen Haltepunkt für diese (zu Stützpunkten gehen und einen neuen erstellen): - [NSException raise]
  2. Alternativ können Sie tatsächlich sehen, was das Objekt an dieser mem Lage ist:

    Info-Symbol 0x1081ad0 oder

    Infozeile * 0x1081ad0

Es gibt weitere Informationen unter cocoadev wiki entry for exceptionhandling und debugging tips for objective C at cocoawithlove.

9

Steven ist richtig - der GDB Befehl po ist eine Abkürzung für print-object, die eigentlich nennt -debugDescription (nicht -description, wie man erwarten könnte) auf dem Objekt als Argument zur Verfügung gestellt. In vielen Fällen sehen Sie bei beiden Methoden dasselbe Ergebnis, da das eine das andere aufruft, sofern es nicht überschrieben wird. (Siehe zugehörigen . Hinweis: callout auf this Apple technote für Details beachten, dass in ihrem Codeb. po $r3 druckt den Inhalt eines PowerPC-Registers, aber Sie können eine beliebige Objekt Zeiger/Referenz verwenden, einschließlich Intel-Register, etc.)

Beachten Sie außerdem, dass print-object nur für gültige Objekte funktioniert, die nicht freigegeben wurden. Es wird überhaupt nicht helfen, wenn Sie eine Nachricht an einen Borked-Zeiger senden. Angesichts des von Ihnen genannten Fehlers scheint es sich jedoch um eine gültige Objektinstanz zu handeln, die die Methode, die Sie aufrufen möchten, nicht implementiert.

Es ist auch entfernt möglich, dass das Objekt bereits zerstört wurde. This answer sollte in diesem Fall helfen.


Edit:

Es gibt auch andere Möglichkeiten, um Objekte im Debugger "zu untersuchen".Ich fragte this SO question über Xcode-Datenformatierer, die eine Möglichkeit ist, wie Sie feststellen können, wie eine benutzerdefinierte Klasse in der Summary-Spalte des Debuggers angezeigt wird. Die Dokumentation aus dieser Frage erklärt, wie es funktioniert. Ich habe den zusammenfassenden Ansatz gefunden, der viel hilft, den Zustand eines Objekts zu sehen.

0

Ihre Instanz ist nicht gültig. Du hast das Objekt irgendwo anders freigelassen, aber du hast deinen Zeiger nicht gelöscht ... aktiviere Zombie-Erkennung.

Verwandte Themen