2012-06-08 7 views
2

응용 프로그램이 다음 오류로 인해 충돌합니다.HEAP_NO_SERIALIZE 힙의 다중 스레드 액세스

=========================================================== 
VERIFIER STOP 00000003: pid 0x2E54: multithreaded access in HEAP_NO_SERIALIZE heap 
     00161000 : Heap handle 
     00001444 : Thread owning heap lock 
     00003188 : Current thread trying to acquire the heap lock 
     00000000 : 
=========================================================== 

응용 프로그램의 전체 페이지 힙을 사용하도록 설정했습니다. 응용 프로그램이 임의의 위치에서 충돌합니다. 흔히 충돌 위치는 STL의 안쪽 부분입니다. 모든 경우에 콜 스택이 손상된 것으로 보입니다.

응용 프로그램은 라이브러리 및 DLL 파일 목록을 사용합니다. 모든 DLL 파일과 라이브러리는 다중 스레드 DLL 라이브러리 (명령 행 옵션 /MD)로 빌드됩니다.

라이브러리 중 하나는 힙에 메모리를 할당하는 방법으로 HeapAlloc을 사용하고 있습니다.

충돌을 식별하기 위해 어떤 기법을 사용해야합니까?

+0

도움이 될지 모르겠지만 [여기] (http://stackoverflow.com/a/758840/241536)는 WinDbg를 사용하는 방법에 대한 다른 포스터에 답한 답입니다. –

+1

필요한 정보는 VERIFIER STOP 메시지에 있습니다. 동시에 비 직렬화 힙에 액세스하는 두 개의 스레드가 허용되지 않습니다. 두 스레드는 1444 및 3188입니다. 두 스레드가 동시에 동일한 힙에 액세스하지 못하도록 프로그램을 변경해야합니다. –

답변

2

WinDbg에서 프로그램을 실행하여 이미 수행 한 것으로 보입니다.

오류 메시지의 흥미로운 비트에 빠른 구글 검색

는로드 일부 모듈이 단일 threadded CRT에 연결되어 있음을 나에게 제안은 MSDN 문서 Multithreaded Access In A HEAP_NO_SERIALIZE Heap을 발견했다.

MD 라이브러리를 사용하여 이 실제로인지 확인하기 위해 프로젝트의 각 부분과 모든 프로젝트 설정을 신중하게 검토합니다. 뭔가가 정적으로 연결될 수 있습니다.

+0

라이브러리가 정적으로 링크되어 있는지 여부를 어떻게 확인할 수 있습니까? Visual Studio 2008을 사용하고 있습니다. – Maanu

+0

프로젝트 설정을 확인하십시오. –

2

하면 문자 수정 WinDbg를 사용하여 첨부 :

.symfix;reload; 

실행 자동화 된 충돌 분석 :

~* kb; 

당신에게 : 당신은 모든 스레드의 호출 스택을 검사 할 수 있습니다

!analyze -v 

Dependency Walker 및 s를 사용하여 모듈에 대한 의존성을 확인할 수 있습니다. 단일 스레드 CRT를 사용하는 경우 ee가 표시되지만 어떤 것이 정적으로 연결된 경우 John Dibling suggests과 같은지 확인합니다.

당신은 프로젝트 설정에서이를 확인할 수 있습니다 구성 속성 ->C/C++ ->코드 생성 ->확인 런타임 라이브러리을. 'Multi-threaded DLL (/ MD)'이라고 말해야합니다.

관련 문제