Сбой сборочной работы с мусором, если загружен 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.
Ответы
Ответ 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 по разным причинам.