【发布时间】: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所做的只是通过函数指针调用,所以很难猜出它在做什么。