【问题标题】:application is locked malloc -> OSSpinLockLock$VARIANT$mp应用程序被锁定 malloc -> OSSpinLockLock$VARIANT$mp
【发布时间】:2013-03-10 11:07:30
【问题描述】:

我的 iphone 应用程序被锁定 malloc。如果我在 Xcode 中按下 pause 按钮,它会在 OSSpinLockLock$VARIANT$mp 函数中暂停。

#0  0x95dfbc2d in OSSpinLockLock$VARIANT$mp ()
#1  0x95dc2613 in szone_malloc_should_clear ()
#2  0x95dc366b in szone_malloc ()
#3  0x95df9962 in malloc_zone_malloc ()
#4  0x95dfa882 in malloc ()
#5  0x0219743a in operator new(unsigned long) ()

如果我按下continue,然后再次按下pause,那么它总是显示相同的堆栈跟踪。

【问题讨论】:

  • 这表明你已经损坏了堆。或者可能是某个线程在持有锁时被信号终止。

标签: ios xcode locking malloc deadlock


【解决方案1】:

看看你的其他线程。其中一个很可能在 malloc 或 free 内部被阻塞,并且两者相互僵持。

这种情况的一个常见原因是在信号处理程序内部分配内存(您永远不应该这样做)。如果您的系统中有某种“crash catcher”,并且您在处理程序内部执行复杂的操作,您会看到这一点。

【讨论】:

  • 我不确定什么是信号处理程序。我想我没有使用它。 (处理SIGABRT等的功能)我使用Facebook SDK。当我按下暂停时,我在 xcode 中只看到 1 个挂起的线程。它始终是从 Facebook 回调函数调用的 C++ 代码。如果它是死锁,那么我可以期望暂停 2 个线程中的一个,但并不总是第一个或第二个。我希望你明白。现在我无法复制,但它在早上发生了 3 次,我之前见过几次。所以存在一些问题。谢谢
  • 只有一个线程非常令人惊讶,尤其是在运行 Facebook API 的情况下。我预计至少有 5 个。查看他们的堆栈,看看他们是否在某个时候也调用了 SpinLock。是的,信号处理程序将是 SIGABRT 之类的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多