12 Stimmen

Wie debuggt man am besten einen Absturz innerhalb von objc_msgSend?

Ich habe einen Absturz, der auftritt, wenn ein NSAutoreleasePool Abflüsse. Vermutlich versucht der Pool, ein Objekt freizugeben, das von einem anderen Teil des Codes vorzeitig freigegeben wurde. Der Absturz, den ich habe, ist in der Mitte von objc_msgSend da es versucht, eine Nachricht an ein Objekt zu senden, das nicht mehr existiert.

Welche Tipps/Tricks/Verfahren/ gdb Befehle, die mir zur Verfügung stehen, um Informationen über das betreffende Objekt und/oder den Zeitpunkt der unrechtmäßigen Freigabe zu erhalten?

17voto

Teemu Kurppa Punkte 4709

Wenn Sie eine Vermutung haben, dass es sich um eine vorzeitige Löschung handelt, lassen Sie Zombies Ihre Hypothese bestätigen und untersuchen Sie dann, was vor sich geht. Wenn Sie Zombies aktivieren, werden Objekte nicht wirklich zerstört, sondern in einen Zombie-Zustand versetzt, was Ihnen hilft, zu erkennen, wann auf sie zugegriffen wird, nachdem sie dealloc aufgerufen wurden. Lesen Sie mehr von NSZombieEnabled

7voto

Pierre Houston Punkte 1601

4voto

Wevah Punkte 28010

Wenn Sie NSZombieEnabled verwenden, können Sie zumindest herausfinden, welcher Klasse das Objekt angehört.

4voto

Justyn Punkte 1392

Ich stieß auf etwas, das wie ein Absturz aussah, in objc_msgSend . Was noch seltsamer war, war application:didFinishLaunchingWithOptions: wurde nicht einmal erreicht, bevor der so genannte Crash eintrat!

In meinem Fall stellte sich heraus, dass der Absturz ein Haltepunkt war, den ich versehentlich an einer Speicheradresse gesetzt hatte, die aufgerufen wurde, bevor mein Code überhaupt erreicht wurde.

enter image description here

Nachdem ich etwa eine Stunde lang versucht hatte, dies herauszufinden, deaktivierte ich den Haltepunkt, führte den Code aus, verzog das Gesicht und setzte dann meinen Tag fort, indem ich so tat, als wäre es nie passiert

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X