Objective c 加载dylib时垃圾收集工作队列崩溃

Objective c 加载dylib时垃圾收集工作队列崩溃,objective-c,macos,garbage-collection,pthreads,osx-mountain-lion,Objective C,Macos,Garbage Collection,Pthreads,Osx Mountain Lion,我们正在将一个应用程序从10.6移植到10.8。我在看我们在应用程序中加载的动态库。我在垃圾收集工作队列中面临非常不寻常的崩溃,出现以下消息 malloc: Thread::suspend(): unable to suspend a thread: err = 268435459, Thread 0x111000000: _pthread = 0x108129000, _thread = 0x8b07, _stack_base = 0x108129000, enlivening on,

我们正在将一个应用程序从10.6移植到10.8。我在看我们在应用程序中加载的动态库。我在垃圾收集工作队列中面临非常不寻常的崩溃,出现以下消息

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\u ENABLE\u OBJC\u GC=required
。如果我在动态库中有
GCC\u ENABLE\u OBJC\u GC=required
,它仍然会崩溃。我无法在应用程序中关闭垃圾收集器。我必须从动态库管理它崩溃

崩溃的原因是垃圾收集器无法挂起线程。(如日志中所述)。此线程是使用创建的。若我在动态库的构造函数中放入一个不确定的while循环(带sleep),我就不会崩溃。当构造函数完成执行时,我会崩溃

它们是告诉垃圾收集器不要尝试挂起线程的一种方法吗?或者增加线程的引用计数?或者我可以做些什么来阻止垃圾收集器,以免干扰我的动态库代码

我们正在将一个应用程序从10.6移植到10.8。 崩溃的原因是垃圾收集器无法挂起线程

这是意料之中的事。
从OSX 10.8开始,不推荐使用垃圾收集。因此CG无法暂停线程以执行其任务。结果,你得到了你所面临的所有问题

如果您想开发10.8,您需要转换为ARC(最佳)或返回到手动参考计数。如果要移动到arc,请参阅


关于10.8的苹果文档:

重要提示:从OS X v10.8开始,不推荐使用垃圾收集。 改用ARC(自动参考计数)。了解更多关于 ARC,请参见过渡到ARC发行说明

资料来源:

答案:

  • 它们是告诉垃圾收集器不要尝试挂起线程的一种方法吗
不,这就是它的工作原理

  • 或者增加线程的引用计数?或者我可以做些什么来阻止垃圾收集器,以免干扰我的动态库代码
不会。因为GC在10.8下不推荐使用,所以如果您希望支持10.8,sou必须去掉它

GC在MAC平台上是一种非常短命的技术。由于各种原因被ARC取代

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
关于10.8的苹果文档:

重要提示:从OSXV10.8开始,不推荐使用垃圾收集。改用ARC(自动参考计数)。要了解有关ARC的更多信息,请参见转换为ARC发行说明


您能否澄清:您是否打算让您的项目使用GC?还是不?我的第一个猜测是,您正在加载的动态库是使用GC构建的,但您的主应用程序不是。我只是在编写动态库,加载动态库会导致崩溃。应用程序是使用GC构建的(GCC_ENABLE_OBJC_CC=required)。若我在dylib上启用或取消绑定标志,这并不重要。它仍然崩溃。你用什么编译器处理这两个问题?gcc版本?另外:部署目标是什么,基本SDK?我试过LLVM和GCC4.2。10.8及其10.8和10.6及其10.6的基本SDK。我们在代码中有一些特定于平台的API,主要是因为有些东西被贬低了。仅仅因为有些东西被弃用并不意味着它不再工作。这只是意味着它不应该再用于新代码,它最终会消失。如果它们立即停止工作,那么将它们标记为已弃用将是毫无意义的-然后它们可以立即被删除。是的,但是在10.8下会突然出现很多问题,比如OP遇到的问题。你会认真推荐MacGeek继续使用不推荐的技术,并花时间尝试修补吗?