2017-05-09 23 views
4

私は、このスタックトレースでハングするスレッドを実行しています(OS X 10.10.5)。約20時間後に作動し、恐らく低メモリ状態に関係します。しかし、問題は、mallocがnullを返すのはなぜですか?なぜスレッドの実行は停止する必要がありますか?要求された実際のバイト数は小さい(パス上の文字列操作の場合)。mallocが返されないのはなぜですか?

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 

一時的なディレクトリを消去して、起動ディスクがプログラムによって生成された一時ファイルでいっぱいにならないようにすることです。このプロセスは失敗し、ディスクは実際にいっぱいになり、スレッドは停止し(実際に停止し、メインスレッドが結合されます)、ディスクからファイルを削除するプロセスが停止します。また、スレッドが停止しているため、プロセスを強制終了する必要があります。私はあなたがこれをバグと呼ぶことができるかどうかはわかりません。なぜなら、失敗するプロセスは実際に何が起きるのを防ぐ試みなのでしょうか?

あなたの洞察をいただきありがとうございます。

+1

*おそらくメモリ不足に関連しています* - つまり、プログラムのバグです。 – PaulMcKenzie

+7

@PaulMcKenzie、なぜ地球上?バグのない低メモリ状態につながるシナリオはたくさんあります。 – SergeyA

+0

'malloc'を直接呼び出すのではなく、' new'を呼び出すように見えます。 'new'は' no throw'を使わないと投げられることが許されます。 – NathanOliver

答えて

0

ディスクがいっぱいであるため、カーネルはおそらくメモリをディスクにスワップして失敗している可能性があります。このような状況では、macOSは制御外のプロセスを強制終了するのではなく、中断します。たとえば、kill -CONT <PID>を使用して、空き領域を解放したり、他のアプリケーションを閉じて中断したプロセスを再開したりするという考えがあります。

実際の問題は、あまりにも多くのメモリを割り当てているか、またはメモリがリークしていることです。

関連する問題