Jak znaleźć przyczynę błędu malloc "double free"?

Programuję aplikację w Objective-C i dostaję ten błąd:

MyApp(2121,0xb0185000) malloc: *** błąd dla obiektu 0x1068310: double free
*** ustaw punkt przerwania w malloc_error_break do debugowania

Dzieje się to, gdy wypuszczam NSAutoreleasePool i nie mogę rozgryźć, jaki obiekt wypuszczam dwa razy.

Jak ustawić jego breakpoint?

Czy istnieje sposób, aby wiedzieć, co to jest "obiekt 0x1068310"?

Author: Cœur, 2009-06-09

13 answers

Dowiesz się, czym jest obiekt po włamaniu się do debuggera. Wystarczy spojrzeć w górę stosu połączeń i znajdziesz, gdzie można go uwolnić. To ci powie, który to obiekt.

Najprostszym sposobem na ustawienie punktu przerwania jest:

  1. przejdź do Run -> Show - > Breakpoints (ALT-Dowództwo-B )
  2. przewiń do dołu listy i dodaj symbol malloc_error_break
 37
Author: Frank Krueger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-07 13:18:22

Gdy obiekt jest "dwukrotnie uwolniony", najczęstszą przyczyną jest to, że (niepotrzebnie) zwalniasz obiekt z autorelease, a następnie jest on automatycznie uwalniany, gdy pula z autorelease jest opróżniana.

Odkryłem, że najlepszym sposobem na wyśledzenie dodatkowego wydania jest użycie zmiennej środowiskowej NSZombieEnabled dla pliku wykonywalnego w Xcode. Aby szybko dowiedzieć się, jak z niego korzystać, sprawdź ta strona wiki CocoaDev. (Oprócz tej strony Apple ma udokumentowane kilka niezwykle niejasne, ale przydatne wskazówki dotyczące debugowania kodu w Xcode, z których niektóre zapisały mój boczek więcej niż kilka razy. Proponuję sprawdzić tę notkę techniczną na developer.apple.com -link przeskakuje do sekcji o fundamentach Cocoa).

Edit: często można śledzić obrażający obiekt w debugerze Xcode, ale często jest to znacznie łatwiejsze, jeśli używasz instrumentów, aby ci pomóc. Z Xcode wybierz Run → Start With Performance Tool → Alokacje obiektów i powinieneś być w stanie wyśledzić obrażony obiekt z powrotem do miejsca, w którym został utworzony. (Będzie to działać najlepiej, jeśli masz włączone zombie, jak omówiono powyżej.) Uwaga: Snow Leopard dodaje narzędzie zombie do instrumentów, dostępne również z menu Uruchom. Może być warta tylko 29 dolarów! ;-)

Istnieje również związane z więc pytanie tutaj .

 45
Author: Quinn Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:59

Chcę tylko dodać moje doświadczenie do odpowiedzi Quinn Taylor.

W jednej z moich aplikacji, muszę analizować i zapisywać dane do podstawowych obiektów danych, a później uzyskać te obiekty do wyświetlania w widokach. W rzeczywistości aplikacja działa dobrze i nie zawiesza się w ogóle, dopóki nie próbowałem zrobić testu warunków skrajnych poruszania się tam iz powrotem wiele razy, próbowałem otworzyć wiele widoków tak szybko, jak to możliwe. Aplikacja zawiesza się z powyższym Komunikatem.

Wypróbowałem wszystkie metody, które Quinn zasugerował to w swojej odpowiedzi i nadal nie udało mu się dowiedzieć, gdzie była dokładna przyczyna.

Ustawiłem nszombieenabled=YES, I NSStackLogging = YES, uruchomiłem powłokę komend malloc_history, aby dowiedzieć się dlaczego, ale nadal bez powodzenia. Zawsze wskazuje na to, gdzie zapisuję dane do podstawowych obiektów danych, w rzeczywistości sprawdziłem tysiące razy ponad zwolnionych obiektów, nic dziwnego.

Uruchamianie w instrumentach z różnymi narzędziami (przydziały, przecieki itp...) nadal nie pomogło. Włącz Straż Malloc wciąż nic nie ma.

Final rescue: próbowałem wrócić do widoków, w których obiekty zostały pobrane z podstawowych danych i wysłałem komunikat zachowania do wszystkich tych obiektów, i odnotowałem te zmiany. To rozwiązało problem!!!

Więc, dowiedziałem się, że nie udało mi się zachować jeden, to jest dokładnie przyczyna. Po prostu chcę podzielić się moim doświadczeniem, więc masz kolejną ratunek dla swojej aplikacji.

 12
Author: Hoang Pham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-03 13:32:32

Otwórz konsolę debuggera, naciskając Cmd+Shift + R. tam wpisz

break malloc_error_break

Aby ustawić punkt przerwania na początku funkcji malloc_error_break.

Jeśli chcesz dowiedzieć się, jaki obiekt znajduje się pod adresem 0x1068310, możesz wpisać w konsoli debuggera:

print-object 0x1068310

Oczywiście, musisz to zrobić, gdy obiekt jest jeszcze żywy - jeśli obiekt został już uwolniony do czasu, kiedy to zrobisz, to to nie zadziała.

 9
Author: Adam Rosenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-11 03:51:59

Dla mnie problem został rozwiązany przez

(gdb) call (void)_CFAutoreleasePoolPrintPools()
Zaraz po katastrofie. Adres na górze stosu był adresem sprawcy. Dorzuciłem retain i voila.

Adres podany w logu do niczego mnie nie doprowadził. Nigdy nie pojawił się na żadnym z różnych instrumentów. Najwyraźniej wskaźnik do niektórych wewnętrznych danych, które zostały już uwolnione.

 4
Author: c-alpha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-09 17:59:05

Dodawanie symbolicznego punktu przerwania w Xcode 4

Tylko aktualizacja, aby to miało znaczenie dla Xcode 4...

Z Xcode 4 Podręcznik użytkownika:

Aby dodać symboliczny punkt przerwania . . .

  1. w lewym dolnym rogu nawigatora punktów przerwania kliknij przycisk Dodaj guzik.
  2. Wybierz Dodaj Symboliczny Punkt Przerwania.
  3. Wpisz nazwę symbolu w Pole symbolu.
  4. Kliknij Gotowe.
 4
Author: Old McStopher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-17 19:54:26

Tak wygląda punkt przerwania malloc_error_break w oknie punktów przerwania w Xcode. Trzeba sprawdzić pola, aby to działało.

Alt text http://www.martijnthe.nl/wp-content/uploads/2009/08/Afbeelding-1.png

 3
Author: Martijn Thé,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-05 10:51:57

Sprawdź swoje zajęcia i zajrzyj pod metodę dealloc. Upewnij się, że zależy ci na telefonie [super dealloc].

Miałem dokładnie ten sam problem i dowiedziałem się, że dzwonię. Po prostu nie zwracam uwagi.
 2
Author: Wes Duff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-07 13:18:59

Jest to zwykle spowodowane przez jakiegoś Inspektora, takiego jak safari lub Safari preview. Zobacz też post lub post oraz Pytanie.

Usuń wybór automatycznie Pokaż www ...., usunie ten problem.

Uwaga, po prostu zamknij safari lub Safari preview nie usunie tego problemu. I musisz odznaczyć zarówno Safari, jak i Safari preview.

Jeśli to nie pomoże, zapoznaj się z tym odpowiedź lub post do debugowania.

usuń zaznaczenie opcji inspect automatically on safari preview

 1
Author: Kris Roofe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:02

Proszę znaleźć poniższe kroki, aby znaleźć obiekt, który jest wolny i zawiesić aplikację.

1) Kliknij na " Breakpoint navigator".
2) następnie kliknij na "+" Przycisk, który znajduje się poniżej.
3) Dodaj symbol " Punkt przerwania... " z listy.
4) Dodaj "malloc_error_break "słowo kluczowe na opcji" Symbol ".

LUB możesz również odwołać się do poniższego GIF prezentacja.

GIF represenation

 1
Author: Ramkrishna Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-25 13:52:56

W Xcode kliknij na lewo od numeru linii, aby ustawić punkt przerwania. Następnie możesz go uruchomić, wykonując "Build and Debug".

Zaleca się, aby nie mieć obiektu, który tworzysz be autorelease, ponieważ pamięć jest towarem na iPhone. Apple zaleca jawne wywołanie release.

 0
Author: Benny Wong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-09 18:00:37

Aby znaleźć tego rodzaju problemy z pamięcią i wskaźnikami w ogóle, chcesz uruchomić kod z kontrolerem błędów pamięci uruchomieniowej, takim jak Valgrind . Powinno to być w stanie wskazać wiele rzeczy, które twój kod robi źle, poza tymi, które powodują jego awarię.

Valgrind może działać na OSX (chociaż mówi, że jest "nieobsługiwany, niekompletny i wadliwy"), a przy odrobinie hakowania ktoś dostał go do pracy na iPhone SDK executables .

Jeszcze lepiej możesz wypróbuj instrumenty, które są częścią XCode. Jest tutorial do uruchomienia tutaj .

 0
Author: Jared Oberhaus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-30 01:07:19

Jeśli {[0] } nie pomaga...

Najlepszym sposobem rozwiązania tego błędu jest uruchomienie instrumentów z włączonym NSZombies. Instrumenty oznaczą Cię, gdy Zombie zostanie powiadomiony i możesz śledzić bezpośrednio z powrotem do linii kodu.

Snow Leopard wymagane, co za ratownik choć!

 0
Author: iOSDevSF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-07 13:19:38