2017-05-09 9 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> 사용).

소리가 나면 실제 문제는 너무 많은 메모리를 할당하거나 메모리를 누설하고 있다는 것입니다.