【问题标题】:Why does malloc not return?为什么 malloc 不返回?
【发布时间】:2017-10-08 03:08:55
【问题描述】:

我有一个正在运行的线程 (OS X 10.10.5) 与此堆栈跟踪一起挂起。大约运行 20 小时后,可能与内存不足有关。但是,问题是,为什么 malloc 不直接返回 null?为什么线程的执行需要暂停?实际请求的字节数很小(对于路径上的字符串操作)。

std::wstring finalPath = itsPath.substr(0,ls+1);

  1   operator new(unsigned long) + 37 (libc++abi.dylib + 124485) [0xa0339645] 2
   1   malloc + 29 (libsystem_malloc.dylib + 3997) [0xa1829f9d] 2
    1   malloc_zone_malloc + 116 (libsystem_malloc.dylib + 7243) [0xa182ac4b] 2
     1   default_zone_malloc + 3 (libsystem_malloc.dylib + 67909) [0xa1839945] 2
     *1   thread_exception_return + 0 (kernel + 632362) [0xffffff800029a62a] (runnable) 2

失败操作的目的是清除一个临时目录,这样启动盘就不会被程序生成的临时文件填满。这个过程失败了,磁盘确实填满了,线程停止了(就像真的停止了,主线程加入了它),从磁盘删除文件的过程停止了。此外,由于线程已停止,因此必须终止该进程。我不知道您是否可以准确地将其称为错误,因为失败的过程是试图阻止实际发生的事情。

感谢您的见解。

【问题讨论】:

  • 可能与内存不足有关 -- 换句话说,您的程序中存在错误。
  • @PaulMcKenzie,为什么在地球上?有很多情况会导致内存不足而没有任何错误。
  • 可能相关 -- 当我看到这两个词描述一个问题时,我会怀疑,尤其是“可能”部分。
  • 如果线程似乎挂起(即保持活动状态,但没有取得任何明显进展) - 而不是因异常而死亡 - 可能是它处于某种忙碌循环中,即它一遍又一遍地重复运行相同的代码,而不是挂起。您可以使用“top”或类似实用程序检测到这一点。
  • 我不认为这是一个 C++ 异常,它是从内核异常返回到用户模式。不幸的是,default_zone_malloc 所做的只是通过函数指针调用,所以很难猜出它在做什么。

标签: c++ c macos darwin


【解决方案1】:

您提到磁盘已满,因此内核可能正在尝试将内存换出到磁盘并失败。在这种情况下,macOS 会暂停,而不是杀死失控的进程。这个想法是您释放一些空间和/或关闭一些其他应用程序,然后恢复暂停的进程,例如使用kill -CONT <PID>

听上去,真正的问题是你分配了太多的内存,或者内存泄漏。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 2013-05-16
    • 2021-08-29
    • 2011-01-09
    • 2011-05-24
    • 2022-01-02
    • 2016-07-18
    • 2012-02-27
    • 2011-12-07
    相关资源
    最近更新 更多