- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
VS2005의 버그 때문에 이 VS2005로 컴파일한 exe 파일만 실행해도 재부팅이 발생할 수 있습니다.
그 조합은 Windows XP SP2, IE6(기타 보안패치를 설치하지 않은 상태)에 Visual Studio 2005 상세 버전 8.0.50727.42로 빌드한 exe 파일을 실행할때 입니다.
문제는 exe 파일을 한번만 실행하면 괜찮은데, 2회에서 3회 반복 실행하면 재부팅이 발생합니다(이것도 PC마다 다름).
*** An Access Violation occurred in C:\WINDOWS\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16:
The instruction at 7C9401B3 tried to write to an invalid address, 75DE193E
*** enter .exr 018FECE8 for the exception record
*** enter .cxr 018FED04 for the context
*** then kb to get the faulting stack
Break instruction exception - code 80000003 (first chance)
ntdll!DbgBreakPoint:
001b:7c93120e cc int 3
1: kd> !analyze -v
FAULTING_IP:
ntdll!RtlAllocateHeap+1da
001b:7c9401b3 884706 mov byte ptr [edi+6],al
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 7c93120e (ntdll!DbgBreakPoint)
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 3
Parameter[0]: 00000000
Parameter[1]: 7c997810
Parameter[2]: 00000028
ERROR_CODE: (NTSTATUS) 0x80000003 - {
EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) -
EXCEPTION_PARAMETER1: 00000000
EXCEPTION_PARAMETER2: 7c997810
EXCEPTION_PARAMETER3: 00000028
NTGLOBALFLAG: 0
FAULTING_THREAD: ffffffff
ADDITIONAL_DEBUG_TEXT: Enable Pageheap/AutoVerifer
DEFAULT_BUCKET_ID: HEAP_CORRUPTION
PRIMARY_PROBLEM_CLASS: HEAP_CORRUPTION
BUGCHECK_STR: APPLICATION_FAULT_HEAP_CORRUPTION_STATUS_BREAKPOINT
LAST_CONTROL_TRANSFER: from 75df2137 to 7c9401b3
STACK_TEXT:
7c9401b3 ntdll!RtlAllocateHeap+0x1da
75df2137 sxs!CSxsPointerBase<CXMLNamespaceManager::CNamespacePrefix,CSxsPointer<CXMLNamespaceManager::CNamespacePrefix,CXMLNamespaceManager::CNamespacePrefix::ms_szTypeName> >::HrAllocateBase+0x59
75de2f21 sxs!CXMLNamespaceManager::OnCreateNode+0x12e
75de38d2 sxs!CNodeFactory::CreateNode+0xa3
75de435f sxs!XMLParser::Run+0x2fc
75de8baa sxs!SxspIncorporateAssembly+0x8b8
75de9a0f sxs!SxspCloseManifestGraph+0x98
75de98cd sxs!SxsGenerateActivationContext+0x54c
75a9a5ed basesrv!BaseSrvSxsCreateActivationContextFromStruct+0x194
75a9a760 basesrv!BaseSrvSxsCreateActivationContextFromMessage+0x79
75a84a47 CSRSRV!CsrApiRequestThread+0x431
STACK_COMMAND: .cxr 018FED04 ; kb ; dds 18fefd0 ; kb
SYMBOL_NAME: heap_corruption!heap_corruption
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: heap_corruption
IMAGE_NAME: heap_corruption
DEBUG_FLR_IMAGE_TIMESTAMP: 0
FAILURE_BUCKET_ID: HEAP_CORRUPTION_80000003_heap_corruption!heap_corruption
BUCKET_ID: APPLICATION_FAULT_HEAP_CORRUPTION_STATUS_BREAKPOINT_heap_corruption!heap_corruption
Followup: MachineOwner
---------
이 상태에서 F5(Go)를 하면 다시 아래와 같은 BugCheck이 발생하면서 완전히 재부팅됩니다.
1: kd> g
*** Fatal System Error: 0xc000021a
(0xE10C62F8,0xC0000005,0x7C9401B3,0x018FED04)
STOP: c000021a Unknown Hard Error
Unknown Hard ErrorBreak instruction exception - code 80000003 (first chance)
A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.
A fatal system error has occurred.
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
Use !analyze -v to get detailed debugging information.
BugCheck C000021A, {e10c62f8, c0000005, 7c9401b3, 18fed04}
unable to get nt!KiCurrentEtwBufferOffset
unable to get nt!KiCurrentEtwBufferBase
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
WINLOGON_FATAL_ERROR (c000021a)
The Winlogon process terminated unexpectedly.
Arguments:
Arg1: e10c62f8, String that identifies the problem.
Arg2: c0000005, Error Code.
Arg3: 7c9401b3
Arg4: 018fed04
Debugging Details:
------------------
unable to get nt!KiCurrentEtwBufferOffset
unable to get nt!KiCurrentEtwBufferBase
... 생략 ...
ERROR_CODE: (NTSTATUS) 0xc000021a - {
EXCEPTION_CODE: (NTSTATUS) 0xc000021a - {
EXCEPTION_PARAMETER1: e10c62f8
EXCEPTION_PARAMETER2: c0000005
EXCEPTION_PARAMETER3: 7c9401b3
EXCEPTION_PARAMETER4: 18fed04
ADDITIONAL_DEBUG_TEXT: Windows SubSystem
BUGCHECK_STR: 0xc000021a_csrss.exe_c0000005
DEFAULT_BUCKET_ID: DRIVER_FAULT
PROCESS_NAME: System
LAST_CONTROL_TRANSFER: from 8085f2bf to 8080ba52
SYMBOL_ON_RAW_STACK: 1
STACK_ADDR_RAW_STACK_SYMBOL: fffffffff78d2b8c
STACK_COMMAND: dds F78D2B8C-0x20 ; kb
STACK_TEXT:
f78d2b6c 8a2e8240
f78d2b70 00000000
f78d2b74 e165e4f8
f78d2b78 e15ae350
f78d2b7c e165e488
f78d2b80 00000000
f78d2b84 00000000
f78d2b88 b78268a4 mrxdav!_NULL_IMPORT_DESCRIPTOR+0x3c
f78d2b8c b77fe000 mrxdav!MrxDAVEfsControlCompletion <PERF> (mrxdav+0x0)
f78d2b90 808cf973 nt!MiSnapThunk+0x6f
f78d2b94 8a32c008
f78d2b98 b782735e mrxdav!_NULL_IMPORT_DESCRIPTOR+0xaf6
f78d2b9c 000000ff
f78d2ba0 b78268a4 mrxdav!_NULL_IMPORT_DESCRIPTOR+0x3c
f78d2ba4 b7804aa8 mrxdav!_imp__GetSecurityUserInfo
f78d2ba8 808cfae6 nt!MiSnapThunk+0x382
f78d2bac 00000001
f78d2bb0 00000000
f78d2bb4 b77fe000 mrxdav!MrxDAVEfsControlCompletion <PERF> (mrxdav+0x0)
f78d2bb8 f78ee924
f78d2bbc b7804aa8 mrxdav!_imp__GetSecurityUserInfo
f78d2bc0 b78274ba mrxdav!_NULL_IMPORT_DESCRIPTOR+0xc52
f78d2bc4 00000000
f78d2bc8 e165e301
f78d2bcc f7477958 KSecDD!DESParityTable <PERF> (KSecDD+0x14958)
f78d2bd0 00000000
f78d2bd4 0000000e
f78d2bd8 b7827372 mrxdav!_NULL_IMPORT_DESCRIPTOR+0xb0a
f78d2bdc 8a2e8240
f78d2be0 f78ee9b4
f78d2be4 f7b774ba Ntfs!NtfsFsdClose+0x3b0
f78d2be8 8a0c1978
FOLLOWUP_IP:
mrxdav!_NULL_IMPORT_DESCRIPTOR+3c
b78268a4 5c pop esp
SYMBOL_NAME: mrxdav!_NULL_IMPORT_DESCRIPTOR+3c
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: mrxdav
IMAGE_NAME: mrxdav.sys
DEBUG_FLR_IMAGE_TIMESTAMP: 41107b91
FAILURE_BUCKET_ID: 0xc000021a_csrss.exe_c0000005_mrxdav!_NULL_IMPORT_DESCRIPTOR+3c
BUCKET_ID: 0xc000021a_csrss.exe_c0000005_mrxdav!_NULL_IMPORT_DESCRIPTOR+3c
Followup: MachineOwner
---------
자세한 원인 분석은 생략하겠습니다. 귀찮기도 하고 분석을 해봐도 뭐가 잘못된건지도 잘 모르겠고...
해결책은 이렇습니다.
VS2005 서비스팩1(KB926605)과 패치(KB932237)를 설치한다.
결론은 서비스팩1과 패치가 설치되지 않은 VS2005는 잘못된 exe를 생성해낸다는 것입니다.
지금까지 설명한 것과 비슷한 문제가 발생한다면, Visual Studio 2005 서비스팩과 패치를 설치해보는 것을 권장합니다.
원인을 발견하기까지
빌드 서버에서 빌드한 exe를 실행하면 계속 재부팅 현상이 발생하는데, 개발자 PC에서 빌드한 바이너리는 정상적으로 동작하는 것이었습니다. 약 이틀동안의 삽질을 하면서 소스코드의 별별 장소를 다 바꿔보고, 컴파일 옵션도 바꿔봤지만 소용이 없었습니다.
더 웃긴것은 문제가 발생하는 사람도 있고 그렇지 않은 사람도 있었던 것입니다.
그때 문득 팀원 중 한명이... 개발자 PC와 빌드 서버의 환경이 다른것이 아닐까? 하는 의견과 함께 VS2005의 버전을 확인하기 시작했습니다.
문제가 생기지 않는 개발자의 VS2005 버전은 8.0.50727.867(서비스팩1과 패치 설치)이었고 문제가 생기는 개발자와 빌드 서버의 VS2005 버전은 8.0.50727.42 였던 것입니다.
끝으로
빌드 서버를 이용한 개발환경에서 개발 도구(VS2005)의 버전 때문에 예상치 못한 문제가 발생할 수 있다는 점을 경험하게 되었습니다.
개발자 PC의 개발 도구(VS2005)와 빌드 서버의 개발 도구(VS2005)의 버전은 항상 일치시키켜야 합니다. 그렇지 않으면 버전 차이로 인해 원인 추적이 까다로운 문제가 발생할 수 있습니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.