none
dll에서 crash 발생했는데 콜스택에 ntdll만 나옵니다. windbg 분석질문드립니다. RRS feed

  • 질문

  • ActiveX Control(ocx)에서 UI가 있는 dll을 사용해서 ie위에 차일드윈도우로 어떤 역활을 하는데요.

    이 dll에서 크래쉬가 발생하는데 미니덤프를 남게 해서 분석중입니다.

    문제가 발생한 스택프레임의 콜스텍은

    00 1c3fab84 00000000 ntdll+0x20c52

    하나만 나오네요.ㅠㅠ

    크래쉬가 발생한 dll의 코드가 잡히는

    다른 스택프레임을 보는데... 메인 윈도우(ocx의 차일드)가 메모리영역이 깨져 있습니다.

    크래쉬가 발생한 스택은 ntdll만나오는 스택이지만

    어째뜬 해당 dll의 특정 스택에 이미 메모리가 깨져 있어서 이 원인을 찾아야 하는데.

    이 메모리가 깨져있는 스택은 delete라든가 해지되는 시점에 호출될 수 없습니다.

    즉 어딘가 외부요인에 의해서 메모리가 깨진걸로 예상합니다.

    기타 덤프 정보는


    FAULTING_IP:
    RCFace_62ea0000!TrailingDownVec+80 [f:\dd\vctools\crt\vcruntime\src\string\i386\memcpy.asm @ 505]
    6302d360 f30f6f06        movdqu  xmm0,xmmword ptr [esi]

    EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
    ExceptionAddress: 6302d360 (RCFace_62ea0000!TrailingDownVec+0x00000080)
       ExceptionCode: c0000005 (Access violation)
      ExceptionFlags: 00000000
    NumberParameters: 2
       Parameter[0]: 00000000
       Parameter[1]: 3336ffb0
    Attempt to read from address 3336ffb0

    CONTEXT:  00000000 -- (.cxr 0x0;r)
    eax=c0000034 ebx=00000003 ecx=00000000 edx=00000000 esi=319afd7c edi=00000000
    eip=778afda1 esp=319afd38 ebp=319afda0 iopl=0         nv up ei pl zr na pe nc
    cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
    ntdll+0x1fda1:
    778afda1 83c404          add     esp,4

    DEFAULT_BUCKET_ID:  WRONG_SYMBOLS

    PROCESS_NAME:  iexplore.exe

    ADDITIONAL_DEBUG_TEXT: 
    You can run '.symfix; .reload' to try to fix the symbol path and load symbols.

    FAULTING_MODULE: 75780000 kernel32

    DEBUG_FLR_IMAGE_TIMESTAMP:  58eeefb2

    MODULE_NAME: RCFace_62ea0000

    ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx

    EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx

    EXCEPTION_PARAMETER1:  00000000

    EXCEPTION_PARAMETER2:  3336ffb0

    READ_ADDRESS:  3336ffb0

    FOLLOWUP_IP:
    RCFace_62ea0000!TrailingDownVec+80 [f:\dd\vctools\crt\vcruntime\src\string\i386\memcpy.asm @ 505]
    6302d360 f30f6f06        movdqu  xmm0,xmmword ptr [esi]

    APP:  iexplore.exe

    ANALYSIS_VERSION: 6.3.9600.17237 (debuggers(dbg).140716-0327) x86fre

    MANAGED_STACK: !dumpstack -EE
    No export dumpstack found

    LAST_CONTROL_TRANSFER:  from 73a839a0 to 778c98d5

    PRIMARY_PROBLEM_CLASS:  WRONG_SYMBOLS

    BUGCHECK_STR:  APPLICATION_FAULT_WRONG_SYMBOLS

    STACK_TEXT: 
    6302d360 6302d360 rcface!TrailingDownVec+0x80


    FAULTING_SOURCE_LINE:  f:\dd\vctools\crt\vcruntime\src\string\i386\memcpy.asm

    FAULTING_SOURCE_FILE:  f:\dd\vctools\crt\vcruntime\src\string\i386\memcpy.asm

    FAULTING_SOURCE_LINE_NUMBER:  505

    FAULTING_SOURCE_CODE: 
    No source found for 'f:\dd\vctools\crt\vcruntime\src\string\i386\memcpy.asm'


    SYMBOL_STACK_INDEX:  0

    SYMBOL_NAME:  rcface!TrailingDownVec+80

    FOLLOWUP_NAME:  MachineOwner

    IMAGE_NAME:  RCFace.dll

    STACK_COMMAND:  dps 6302d360 ; kb

    BUCKET_ID:  WRONG_SYMBOLS

    FAILURE_BUCKET_ID:  WRONG_SYMBOLS_c0000005_RCFace.dll!TrailingDownVec

    ANALYSIS_SOURCE:  UM

    FAILURE_ID_HASH_STRING:  um:wrong_symbols_c0000005_rcface.dll!trailingdownvec

    FAILURE_ID_HASH:  {e0c0dcbe-1ebf-aa5f-b2ab-6bc5dbc98e2c}

    Followup: MachineOwner
    ---------

    도움 부탁드립니다.

    참고로 trailingdownvec는 제 dll에 있는 함수는 아니고,

    아마 vcruntime에 있는 memcpy와 관련있는 함수 같습니다.


    • 편집됨 dearjhm 2017년 4월 20일 목요일 오전 8:30
    2017년 4월 20일 목요일 오전 8:29

모든 응답

  • 발생하는 access violation이 다른 곳으로부터의 영향이 의심된다면, full pageheap을 enable하고 덤프를 수집해서 해당 crash에 영향을 미치는 메모리 문제가 있는지 확인해보세요.

    방법은 다음과 같습니다.

    1. Debugging Tools for Windows 설치

    Windows 10 SDK
    https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk

    대상 프로세스가 32비트인 경우 32비트 버전을, 64비트인 경우 64비트 버전을 설치합니다.
    설치 시에 다른 컴포넌트가 필요 없다면 Debugging Tools for Windows만 선택하여 설치합니다.

    2. 대상 프로세스(ActiveX이므로 아마도 iexplore.exe)가 이미 실행 중이라면 종료 시킵니다.

    3. 관리자 권한으로 명령 프롬프트를 열고 Debugging Tools for Windows 설치 경로로 이동한 다음, 다음과 같은 커맨드를 수행합니다.

    gflags.exe /p /enable <process image name> /full

    (예: gflags.exe /p /enable myProcess.exe /full)

    4. 프로세스가 시작 시점에 문제가 없고 실행 중에 문제가 발생하는 것이라면 이 시점에서 대상 프로세스를 실행합니다.

    5. 프로세스에 대해 crash 덤프 룰을 만듭니다.
    Debugging Tools for Windows의 adplus를 이용하여 다음과 같이 설정할 수 있습니다.

    adplus /crash /p <pid> /o <output directory>

    6. 위와 같이 설정을 하면 메모리를 잘못 사용하는 시점에서 프로세스 종료 및 덤프 생성이 이루어질 것입니다.
    만약 질문의 !analyze -v 결과가 말해주는 위치가 아닌 다른 시점에서의 잘못된 메모리 사용으로 인하여 발생하는 문제라면, 그곳이 먼저 잡힐 것입니다 (또는 이와 같은 과정을 반복하여 잘못된 메모리 사용 문제를 잡아나가야 합니다).

    그리고 mini dump보다는 full usermode dump를 수집하여 분석하는 것이 프로세스 내 여러 가지 정보를 확인하는데 도움이 많이 됩니다.

    7. 재현을 하다가 덤프가 생성되면 다음과 같이 명령을 수행하여 full page heap 설정을 해제합니다.
    gflags /p /disable <process image name>

    (full pageheap을 활성화 한채로 방치하면 성능적으로 문제가 발생할 수 있습니다)

    2017년 4월 24일 월요일 오전 2:13