Подтвердить что ты не робот

Сбой сборочной работы с мусором, если загружен dylib

Мы переносим приложение с 10.6 до 10.8. Я смотрю на dylib, который мы загружаем в приложении. Я столкнулся с очень необычным сбоем в Очередь работ по сбору мусора со следующим сообщением.

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

Для приложения GCC_ENABLE_OBJC_GC = required установлено. Если у меня есть GCC_ENABLE_OBJC_GC = required в dylib, он все равно будет терпеть крах. Я не могу отключить сборщик мусора в приложении. Я должен справиться с этим сбоем из моего dylib.

Причина аварийной ситуации заключается в том, что сборщик мусора не может приостановить поток. (как говорится в журнале). Этот поток создается с помощью thread_create(). Если я поставлю неопределенный цикл while (со сном) в конструкторе dylib, я не потерпите крах. Я получаю сбой, когда конструктор завершил выполнение.

Это их способ рассказать сборщику мусора, чтобы не попробовать и приостановить поток? Или увеличить количество ссылок на поток? или что-нибудь, что я могу сделать, чтобы остановить сборщик мусора, чтобы не мешать моему коду dylib.

4b9b3361

Ответ 1

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

Из документации Apple около 10.8:

Важно: Начиная с OS X v10.8 сбор мусора устарел. Вместо этого используйте ARC (Automatic Reference Counting). Дополнительные сведения о ARC см. В разделе Переход к примечаниям о выпуске 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

Ответ 2

Мы переносим приложение с 10.6 до 10.8. Причина сбоя в том, что сборщик мусора не может приостановить нить.

Ожидается.
Начиная с OSX 10.8, сбор мусора устарел. Таким образом, CG не может приостановить потоки для выполнения своих обязанностей. В результате вы получаете все проблемы, с которыми вы сталкиваетесь.

Если вы хотите разработать для 10.8, вам нужно преобразовать в ARC (лучше всего) или вернуться к подсчету ссылок вручную. Если вы хотите перейти на дугу, см. Переход к заметкам о выпуске ARC


Важно: Начиная с OS X v10.8 сбор мусора устарел. Вместо этого используйте ARC (Automatic Reference Counting). Узнать больше о ARC, см. Переход к примечаниям о выпуске ARC.

Источник: Что нового в OS X v10.8 Mountain Lion:

Ответы:

  • Это их способ рассказать сборщику мусора, чтобы не попробовать и приостановить поток?

Нет. Как это работает.

  • Или увеличить количество ссылок на поток? Или что-нибудь, что я могу сделать, чтобы остановить сборщик мусора, чтобы не мешать моему коду dylib.

Нет. Поскольку GC устарел до 10.8, sou должен избавиться от него, если вы хотите поддержать 10.8.

GC была действительно недолговечной технологией на платформе MAC. И заменил ARC по разным причинам.