2011-12-13 2 views
0

레이 트레이싱 응용 프로그램을위한 특수 트리 데이터 구조를 구현했습니다. 각 트리의 노드에서 데이터 항목을 저장하기 위해 std :: list를 사용하고 있습니다. 이 데이터 구조를 사용하여 응용 프로그램을 실행해도 응용 프로그램뿐만 아니라 전체 OS (Windows 7)가 정지되는 문제가 있습니다. 이는 릴리스 모드에서만 발생합니다. 디버그 모드에서는 예상보다 오래 걸리지 만 제대로 작동합니다. Visual Studio 2010을 사용하고 있습니다. 릴리스 모드에서 실행 (Ctrl + F5) 또는 디버깅 (F5)을 수행하면 전체 시스템 충돌이 발생합니다.C++ 전체 시스템 충돌, 릴리스 모드 전용

내가 지금까지 발견 한 바에 따르면, 릴리스와 디버그 모드 사이의 다른 동작은 메모리 누수로 인한 것 같습니다. 디버그 모드 (내가 이해 한 것으로부터)는 좀 더 관대합니다. 그러나 나는 OS에 충돌하는 C++ 응용 프로그램에 대해서는 아무 것도 발견하지 못했습니다.

나는 이런 상황이 발생할 수있는 상황을 알고 싶습니다. 그래서 어디를 봐야하는지 알고 싶습니다. 매우 단순하고 문제를 추적하기 란 쉽지 않습니다. 광선 추적이 매우 평행하고 많은 데이터로 작업하기 때문입니다.

아, 문제는 이 아니며은 스택 오버플로를 일으키는 무한 재귀입니다. 나는 의도적으로 그런 일을 만들었지 만 그것은 OS를 파괴하지는 못했다.

+3

사용자 공간 코드에서 Windows 7을 고정시키는 위업이 있습니다. 대용량 병렬 데이터 및 많은 양의 데이터라고 말하면 리소스가 부족하여 전체 시스템을 거의 멈추게 할 수 있습니까? 나는 사용 가능한 모든 RAM과 스왑을 통해 실행하여 애플 리케이션을 리눅스 시스템을 다운시켜 터미널을 전환하고 애플 리케이션을 죽이려고 3 분 작업이되었다. –

+0

코드가 이식 가능한 경우보다 안정적인 OS에서 컴파일하고 버그의 원인을 찾으십시오. 운영 체제 충돌로 디버깅하는 데는 * 긴 시간이 걸립니다. – thiton

+0

디버그 정보를 사용하여 릴리스 버전을 빌드하면 정상적으로 작동합니까? 그렇지 않으면 충돌이 일어나는 장소를 좁힐 수 있습니다. –

답변

2

디버그 모드에서 메모리 사용을 확인 했습니까? 과도한 메모리 사용과 스왑에 넘친 스왑은 지옥과 같은 시스템 속도를 늦추므로 시스템이 기술적으로 충돌하지 않을 수도 있습니다. 그리고 릴리스 모드에서는 모든 할당이 꽤 빠른 속도로 진행됩니다. 따라서 메모리 사용량을 살펴볼 수 있습니다.

당신이 말했듯이, 무한 재귀가 OS 충돌을 일으키지는 않을 것입니다. 항상 세그먼트 오류가 발생합니다.

+2

그래,이게 내가 얻으려고했던거야. 응용 프로그램이 메모리와 CPU를 너무 빨리 할당 할 수 있기 때문에 스케쥴러는 스왑/페이지 파일을 누르면 기본적으로 게임이 끝난다. –

+0

디버그 모드와 릴리스 모드를 모두 체크인했습니다. 디버그 모드에서 메모리 증가는 거의 없으며 여유가 충분합니다. 해제 모드에서는 촬영이 시작되고 시스템이 정지합니다. 네, 당신은 충돌의 원인에 대해 둘 다 맞았습니다. 하지만 왜 디버그 모드에서 같은 메모리 서지를 보지 못했을까요? – Gigi

+0

죄송합니다. 자신감있는 답변을 드릴 수는 없지만 C++ 런타임 라이브러리가 릴리스 모드에서 동적 메모리 할당 및 dealloc을 처리하는 방법과 관련이있을 수 있습니다. 해당 행을 검색하면 도움이 될 수 있습니다. – shekhar