12

Przesyłamy aplikację od 10,6 do 10,8. Patrzę na dylib, który ładujemy w aplikacji. Mam do czynienia z bardzo niezwykłą awarią w Garbage Collection Work Queue z następującym komunikatem.Awaria kolejki zadań usuwania śmieci, jeśli dylib jest załadowany

malloc: Thread::suspend(): unable to suspend a thread: err = 268435459, Thread 0x111000000: _pthread = 0x108129000, _thread = 0x8b07, _stack_base = 0x108129000, enlivening on, 0 local blocks 

Dla aplikacji GCC_ENABLE_OBJC_GC = required jest ustawiona. Jeśli mam GCC_ENABLE_OBJC_GC = required w dylib, nadal będzie się on zawieszał. Nie mogę wyłączyć narzędzia do zbierania śmieci w aplikacji. Muszę sobie poradzić z moim upadkiem.

Przyczyną wypadku okazuje się, że śmieciarz nie jest w stanie zawiesić wątku. (jak mówi w dzienniku). Ten wątek jest tworzony przy użyciu thread_create(). Jeśli wstawię nieskończoną pętlę while (ze snem) w konstruktorze dylib, to nie ulegnę awarii. Występuje awaria po zakończeniu wykonywania przez konstruktora.

Czy jest to sposób, aby powiedzieć śmieciarzowi, aby nie próbował zawiesić wątku? Lub zwiększyć liczbę odnośników wątku? lub cokolwiek, co mogę zrobić, aby zatrzymać zbieracz śmieci, aby nie zakłócać mojego kodu dyliblowego.

+0

Czy możesz wyjaśnić: czy zamierzasz używać swojego GC w projekcie? albo nie? Moim pierwszym przypuszczeniem jest to, że cecha, którą ładujesz została zbudowana, aby używać GC, ale twoja główna aplikacja nie była. – ipmcc

+0

Po prostu piszę dylib i ładowanie dylib powoduje awarię. Aplikacja została zbudowana, aby używać GC (GCC_ENABLE_OBJC_CC = wymagany). Jeśli włączę lub wyłączyłem flagę na dylib, nie ma to znaczenia. Wciąż się psuje. – MacGeek

+0

jakiego kompilatora używasz dla tych dwóch? Wersja gcc? Ponadto: jakie są cele wdrażania, podstawowe sdks? –

Odpowiedz

-1

Przesyłamy aplikację od 10,6 do 10,8. Powodem awarii okazało się, że śmieciarz nie jest w stanie zawiesić wątku.

Jest to oczekiwane.
Począwszy od wersji OSX 10.8, usuwanie śmieci jest przestarzałe. Więc CG nie jest w stanie zawiesić wątków, aby wykonać swoje obowiązki. W rezultacie otrzymujesz wszystkie problemy, przed którymi stoisz.

Jeśli chcesz rozwinąć 10,8, musisz przekonwertować na ARC (najlepszy) lub powrócić do ręcznego liczenia odwołań. Jeśli chcesz przenieść się do łuku, zobaczyć Transitioning to ARC Release Notes


z dokumentacji firmy Apple o 10,8:

Ważne: Począwszy OS X v10.8, zbieranie śmieci jest przestarzała. Zamiast tego użyj ARC (Automatic Reference Counting). Aby dowiedzieć się więcej o ARC, zobacz Przejście do informacji o wydaniu ARC.

Źródło: What's new in OS X v10.8 Mountain Lion:

Odpowiedzi:

  • jest ich sposób stwierdzić śmieciarza nie spróbować zawiesić wątku?

Nie. Tak to działa.

  • Lub zwiększyć liczbę odnośników wątku? Albo cokolwiek co mogę zrobić, żeby zatrzymać zbieracz nie ingerować w mój kod dylibowy.

Nie. Ponieważ GC jest przestarzałe poniżej 10.8, sou musisz się go pozbyć, jeśli chcesz wspierać 10.8.

GC to naprawdę krótka technologia na platformie MAC. I zastąpiony przez ARC z różnych powodów.

+0

To, że coś jest przestarzałe, nie oznacza, że ​​coś nie działa. Oznacza to po prostu, że nie powinno już być używane dla nowego kodu i że w końcu zniknie. Byłoby bezcelowe oznaczanie rzeczy jako przestarzałych, gdyby przestały działać natychmiast - wtedy można je było natychmiast usunąć. – Sven

+0

Tak, ale istnieje wiele problemów, które nagle pojawiły się w GC poniżej 10,8, na przykład w OP. * Czy ** poważnie ** poleciłbyś MacGeekowi, aby nadal korzystał z przestarzałych technologii i spędzał czas, próbując załatać się po drodze? * – Jean

3
It is expected. 
Starting with OSX 10.8, Garbage collection is deprecated. So CG is unable to suspend the threads to perform its duty. As a result you get all the issues you are facing. 

If you want to develop for 10.8, you need to convert to ARC (best) or move back to manual reference counting. If you wish to move to arc, see Transitioning to ARC Release Notes 

z dokumentacji firmy Apple o 10,8:

Ważne: Początek w OS X v10.8, zbieranie śmieci jest przestarzała. Zamiast tego użyj ARC (Automatic Reference Counting). Aby uzyskać więcej informacji na temat ARC, zobacz Przejście do informacji o wydaniu ARC.

https://books.google.co.in/books?id=8nzwsciij20C&pg=PT431&lpg=PT431&dq=Crash+of+Garbage+Collection+Work+in+objective+c&source=bl&ots=xTjLETFMsO&sig=b33rLeXJVh1WtnAvcVJykfNtvOU&hl=en&sa=X&ved=0ahUKEwiyqZrC2rvNAhVKNI8KHZRdC7AQ6AEIKDAC#v=onepage&q=Crash%20of%20Garbage%20Collection%20Work%20in%20objective%20c&f=false

Powiązane problemy