2009-08-24 10 views
11

Mam awarię, która ma miejsce, gdy odpływ NSAutoreleasePool. Prawdopodobnie pula próbuje zwolnić obiekt, który został przedwcześnie zwolniony przez inny fragment kodu. Zderzenie, które mam, jest w środku objc_msgSend, ponieważ próbuje wysłać wiadomość do obiektu, który już nie istnieje.Jak najlepiej debugować awarię w ramach objc_msgSend?

Biorąc pod uwagę stan stosu, jakie wskazówki/porady/procesy/gdb mam do dyspozycji, aby uzyskać informacje na temat danego obiektu i/lub punkt, w którym miała miejsce nielegalna deallokacja?

Odpowiedz

16

Jeśli masz przeczucie, że jest to przedwczesne usunięcie, włącz zombie, aby potwierdzić swoją hipotezę, a następnie sprawdź, co się dzieje. Po włączeniu zombie obiekty nie są tak naprawdę zniszczone, ale ustawione na stan zombie, który pomaga wykryć, kiedy są one dostępne po wywołaniu dealloc. Więcej Od NSZombieEnabled

+3

Dodatkowo można użyć instrumentu Object Alloc Instrument do śledzenia zdarzeń zatrzymania/zwolnienia obiektu, który został przedwcześnie zwolniony. Nie jest to pula autorelease - to jest problem, ale niektóre wcześniejsze - zwykle. – bbum

+0

@Pang Właśnie zaktualizowałem link. – inga

3

Jeśli używasz NSZombieEnabled, możesz przynajmniej dowiedzieć się, jaka klasa jest obiektem.

+2

przy poprawnej, tequilatango użytkownika odpowiedź dostarcza odpowiedzi wraz z kilkoma przydatnymi szczegółami. – bbum

+0

Całkiem prawdziwa. Mogłem przynajmniej podać link do informacji zewnętrznych. – Wevah

2

natknąłem, co okazało się być katastrofa w objc_msgSend. Co było jeszcze dziwniejsze, nie udało się nawet dotrzeć przed tak zwanym crashem!

W moim przypadku awarie okazały się punktem krytycznym, który ustawiłem nieumyślnie w adresie pamięci, który był wywoływany, zanim którykolwiek z moich kodów został osiągnięty.

enter image description here

Po godzinie albo tak próbuje dowiedzieć się tego, że niezaznaczone punkt przerwania, prowadził kod, twarz palmed a następnie kontynuował mój dzień udając, że nigdy się nie stało ...