VS2005 버그로 인한 재부팅 현상

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

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 공유는 허용합니다.

Published

2009-04-28

Tags

C/C++8