관리 메뉴

kisoo

ADPlus를 사용하여 "중지"와 "충돌" 문제를 해결하는 방법 본문

01.About Programming /3.Debug Lab

ADPlus를 사용하여 "중지"와 "충돌" 문제를 해결하는 방법

JamesK78 2009. 12. 3. 16:27

시스템 요구 사항

ADPlus를 실행하기 위한 최소 요구 사항은 다음과 같습니다.
  • Microsoft Windows NT 4.0 서비스 팩 4 이상
  • Windows Scripting Host 버전 5.6 이상
  • ADPlus가 출력 파일을 저장하기 위해 사용할 수 있는 최소 10MB의 하드 디스크 공간 또는 네트워크 공유
  • Microsoft Debugging Tools for Windows 설치
 

ADPlus 버전 6.0의 새로운 기능

ADPlus V6.0은 완전히 새로 작성되었으며 새로운 스위치와 기능을 제공합니다. 외부 구성 파일을 통해 도구를 구성할 수도 있습니다. Microsoft Windows 디버거 패키지에 포함된 디버거 도움말 파일(Debugger.chm)에서 새로운 기능과 스위치에 대한 최신 정보를 볼 수 있습니다. 패키지를 구하려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/whdc/devtools/debugging/default.mspx (http://www.microsoft.com/whdc/devtools/debugging/default.mspx)
Debugger.chm은 ADPlus.vbs와 같은 폴더에 있습니다. ADPlus 설명서를 찾으려면 목차 탭을 누르고 다음 항목을 찾아 누릅니다.
  • Debugging Tools for Windows
  • Crash Dump Files
  • User-Mode Dump Files
  • Creating a User-Mode Dump File
  • ADPlus
색인 탭을 눌러 ADPlus의 설명서를 찾을 수도 있습니다. 키워드 텍스트 상자에 ADPlus를 입력합니다.

 

ADPlus가 수행하는 작업

ADPlus는 콘솔 기반의 Microsoft Visual Basic 스크립트로, Microsoft CDB 디버거를 자동화하여 하나 이상의 프로세스 디버그 출력을 포함하는 메모리 덤프와 로그 파일을 생성합니다. ADPlus를 실행할 때마다 디버깅 정보(디버그 정보를 포함하는 메모리 덤프와 텍스트 파일)가 로컬 파일 시스템이나 원격 네트워크 공유에 있는 고유한 이름의 새 폴더(예: C:\Temp\Crash_Mode__Date_01-22-2001__Time_09-41-08AMM)에 저장됩니다. 또한 ADPlus에서 만드는 각 파일에는 새 파일이 기존 파일을 덮어쓰지 않도록 고유한 이름(예: PID-1708__Inetinfo.exe__Date_01-22-2001__Time_09-41-08AM.log)이 지정됩니다.

ADPlus는 인터넷 정보 서비스(IIS), Microsoft Transaction Server(MTS) 또는 Microsoft COM+ 응용 프로그램과 같은 사용자 모드 프로세스나 서비스에서 작동합니다.

다음은 ADPlus의 몇 가지 특징입니다.
  • ADPlus는 기능, 속도 및 안정성이 향상된 최신 Microsoft 디버거를 사용합니다.
  • ADPlus는 여러 프로세스에 대한 메모리를 비동기적으로 덤프하므로 각 프로세스가 동시에 중지되고 덤프되어 실행 시 전체 응용 프로그램에 대한 효과적인 "스냅샷"을 제공할 수 있습니다. 문제가 발생할 때 응용 프로그램의 상태를 캡처하려면 해당 응용 프로그램을 구성하는 모든 프로세스와 이 응용 프로그램에서 동시에 사용하는 모든 프로세스를 캡처해야 합니다. 이것은 다른 프로세스에 대한 원격 프로시저 호출을 수행하는 응용 프로그램의 경우 특히 중요합니다.
  • ADPlus에는 명령줄 인터페이스가 있습니다. ADPlus에는 그래픽 사용자 인터페이스가 없기 때문에 원격 명령 셸(Remote.exe를 사용하여 원격 실행되는 명령 셸)에서 자동 모드(대화 상자 표시 안 함)로 실행할 수 있습니다. 자동 모드에서는 오류가 콘솔에 나타나고 이벤트 로그에 기록됩니다. 원격 명령 셸에서 ADPlus를 실행하는 방법에 대한 자세한 내용은 본 문서의 "사용 시나리오" 절을 참조하십시오.
  • ADPlus가 충돌을 모니터링할 때 -notify 스위치를 사용하는 경우 Windows Messenger 서비스가 시작되어 있으면 ADPlus는 Windows Messenger 서비스를 통해 사용자나 컴퓨터에 충돌 경고 메시지를 보낼 수 있습니다.
  • ADPlus가 충돌 모드에서 프로세스를 모니터링할 때 충돌이 발생하면 ADPlus는 충돌 유형에 대한 중요 정보를 이벤트 로그로 보냅니다.
  • ADPlus는 XCOPY 배포를 지원합니다. 테스트 컴퓨터에 ADPlus가 포함된 디버거 패키지를 설치하는 경우 디버거가 설치된 폴더를 다른 컴퓨터로 복사할 수 있습니다. 또한 ADPlus를 사용하기 위해 시스템에 사용자 지정 COM(구성 요소 개체 모델) 구성 요소를 등록할 필요가 없으므로 잠금 소프트웨어 구성이 있는 프로덕션 서버에서 ADPlus를 사용할 수 있습니다. ADPlus를 제거하려면 설치하거나 복사한 폴더를 삭제하기만 하면 됩니다.
ADPlus를 사용해야 할 경우
ADPlus는 복잡한 환경에서 발생하는 문제의 원인을 찾는 데 필요한 디버깅 정보를 Microsoft PSS 지원 담당자에게 제공하기 위해 만들어졌습니다.

다음과 같은 문제가 발생하는 경우 ADPlus를 사용하여 디버깅 정보를 캡처하십시오.
  • 프로세스가 응답을 중지하는 경우
  • 프로세스가 CPU를 단일 프로세서 컴퓨터에서 100%, 이중 프로세서 컴퓨터에서 50%, 사중 CPU 컴퓨터에서 25% 사용할 경우
  • 프로세스가 예기치 않게 충돌하거나 종료될 경우
ADPlus를 사용하지 말아야 할 경우
다음과 같은 경우에는 ADPlus를 사용하지 마십시오.
  • 시작할 때 예기치 않게 종료되는 프로그램이나 프로세스의 문제를 해결해야 하는 경우. 성공적으로 시작한 프로세스에만 ADPlus를 사용할 수 있습니다. 시작할 때 예기치 않게 종료되는 프로세스 문제는 사용자 모드 프로세스 덤프로 해결하는 것이 좋습니다. 사용자 모드 프로세스 덤프에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
    253066  (http://support.microsoft.com/kb/253066/ ) OEM 지원 도구 단계 3의 서비스 릴리스 2 가용성
    또는 최신 디버거를 사용하여 프로세스를 수동으로 디버깅할 수 있습니다. 최신 디버거에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
    http://www.microsoft.com/whdc/devtools/debugging/default.mspx (http://www.microsoft.com/whdc/devtools/debugging/default.mspx)
  • 충돌 모드에서 ADPlus를 사용할 때 성능에 큰 영향을 주는 경우. 일반적으로 Microsoft Visual C++ EH 예외를 많이 발생시키는 DLL(동적 연결 라이브러리)이나 프로그램으로 인해 성능이 크게 저하됩니다. 이러한 예외는 C++ throw 문을 사용하거나 try/catch 블록을 사용할 때 발생합니다. 디버그 출력 스트림에 많은 양의 정보를 기록하는 프로그램도 성능을 저하시킬 수 있습니다. 대부분의 경우 ADPlus는 충돌 모드에서 실행할 때 성능에 큰 영향을 주지 않습니다.
ADPlus를 구하는 방법
ADPlus는 Microsoft Debugging Tools for Windows에 포함되어 있습니다. Microsoft Debugging Tools for Windows를 구하려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/whdc/devtools/debugging/default.mspx (http://www.microsoft.com/whdc/devtools/debugging/default.mspx)
 

ADPlus 작동 방식

ADPlus에는 다음 두 가지 작동 모드가 있습니다.
  • "중지(Hang)" 모드 - 프로세스 중지, CPU 100% 사용 및 충돌과 관련이 없는 그 밖의 문제를 해결하는 데 사용됩니다. 중지 모드에서 ADPlus를 사용할 때는 스크립트를 실행하기 전에 프로세스가 응답을 중지할 때까지 기다려야 합니다. 중지 모드는 충돌 모드와 달리 지속적이지 않습니다.
  • "충돌(Crash)" 모드 - Dr. Watson 오류를 일으키는 충돌이나 예기치 않게 프로그램 또는 서비스를 종료시키는 기타 오류 문제를 해결하는 데 사용됩니다. 충돌 모드에서 ADPlus를 사용할 때는 충돌이 발생하기 전에 ADPlus를 시작해야 합니다. -notify 스위치를 통해 관리자나 컴퓨터에 충돌을 알리도록 ADPlus를 구성할 수 있습니다.

중지 모드

이 모드에서 ADPlus는 스크립트 완료 후 명령줄에 지정된 모든 프로세스에 대한 전체 메모리 덤프를 즉시 생성합니다. 만들어진 각 .dmp 파일은 ADPlus를 실행했을 때의 날짜/시간 스탬프를 포함하는 폴더에 저장됩니다. 각 파일 이름에는 프로세스 이름, 프로세스 ID 및 ADPlus를 실행했을 때의 날짜/시간 스탬프가 포함됩니다. 프로세스 메모리가 파일로 덤프되는 동안 프로세스는 중지됩니다. 메모리 덤프 파일이 만들어진 후 CDB 디버거의 비침입적(non-invasive) 연결/분리를 통해 프로세스가 재개됩니다.

사용 팁 중지 모드에서 Userdump.exe 대신 ADPlus를 사용하여 하나 이상의 프로세스에 대해 메모리를 덤프할 수 있습니다. 중지 모드는 터미널 서버 세션에서도 작동합니다.

충돌 모드

이 모드에서 ADPlus는 CDB 디버거를 명령줄에 지정된 모든 프로세스에 연결하고 자동으로 디버거를 구성하여 다음과 같은 유형의 예외를 모니터링합니다.
  • 잘못된 핸들
  • 잘못된 명령
  • 정수를 0으로 나누기
  • 0으로 부동 소수점 나누기
  • 정수 오버플로
  • 잘못된 잠금 시퀀스
  • 액세스 위반
  • 스택 오버플로
  • C++ EH 예외
  • 알 수 없는 예외
이러한 유형의 예외 문제를 해결할 때는 IIS Exception Monitor나 Userdump.exe 대신 충돌 모드에서 ADPlus를 사용할 수 있습니다. 충돌 모드는 CDB 디버거를 통해 "침입적" 연결을 사용하기 때문에 Microsoft Windows NT 4.0이나 Windows 2000 터미널 서버 세션에서 작동하지 않습니다. 이러한 운영 체제의 터미널 서버 세션에서는 비침입적 연결을 사용하는 중지 모드만 작동합니다. 최신 디버거에서 침입적 또는 비침입적으로 프로세스에 연결하는 방법에 대한 자세한 내용은 디버거 도움말의 "Debugging Tools for Windows: Attaching to a Running Process(User Mode)" 절을 참조하십시오.

참고 충돌 모드는 Windows XP와 Microsoft Windows Server 2003 운영 체제의 터미널 서버 세션에서 지원됩니다.

ADPlus를 충돌 모드에서 실행하는 경우 디버거는 치명적인 예외가 트래핑되고 프로세스가 예기치 않게 종료되거나 사용자가 Ctrl+C 키 조합을 눌러 해당 프로세스에서 디버거를 분리할 때까지 프로세스 수명 동안 명령줄에 지정된 각 프로세스에 계속 연결되어 있습니다. 프로세스에서 디버거를 수동으로 분리하려면 디버거 창을 최대화한 다음 Ctrl+C를 눌러 디버거를 중단해야 합니다.

Ctrl+C를 누르면 ADPlus는 이 명령을 트래핑하고 모든 스레드에 대한 스택을 로그 파일에 나열하기 시작한 다음 프로세스가 디버거에서 분리되기 전에 프로세스에 대한 작은 메모리 덤프 레코드를 생성합니다. 충돌 모드는 침입적 연결을 수행하기 때문에 디버거가 분리되면 프로세스가 중지됩니다. 따라서 프로세스를 다시 시작해야 합니다. MTS나 COM+ 프로세스는 다음에 해당 패키지의 구성 요소가 호출될 때 자동으로 다시 시작됩니다.

첫 번째 예외

첫 번째 예외나 두 번째 예외로 각 예외 유형(액세스 위반, 스택 오버플로 등)이 디버거에 발생할 수 있습니다. 정의에 따르면 첫 번째 예외는 오류 처리기로 적절히 처리되는 경우 치명적이지 않습니다. 적절히 처리되지 않으면 첫 번째 예외는 두 번째 예외로 다시 발생하며 디버거로만 처리할 수 있습니다. 디버거가 두 번째 예외를 처리하지 못하면 응용 프로그램이 종료됩니다.

첫 번째 예외와 두 번째 예외 및 Windows NT SEH(구조적 예외 처리)에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
105675  (http://support.microsoft.com/kb/105675/ ) INFO: 첫 번째와 두 번째 예외 처리
기본적으로 ADPlus는 알 수 없는 예외와 EH 예외를 제외한 모든 유형의 치명적이지 않은 첫 번째 예외를 감지하면 다음 동작을 수행합니다.
  1. 프로세스를 일시 중지하여 모니터링 중인 프로세스에 예외가 발생한 날짜와 시간을 로그 파일에 기록합니다.
  2. 모니터링 중인 프로세스에 대해 예외가 발생한 스레드의 스레드 ID와 호출 스택을 로그 파일에 기록합니다.
  3. 예외 발생 시 고유한 이름으로 프로세스에 대한 작은 메모리 덤프 레코드(.dump -u /m)를 생성한 다음 프로세스를 다시 시작합니다.
참고 첫 번째 EH와 알 수 없는 예외는 자주 발생하므로 ADPlus는 기본적으로 이러한 예외에 대해서는 고유한 작은 메모리 덤프를 생성하지 않습니다. 일반적으로 이러한 예외는 프로세스나 DLL의 오류 처리 코드에 의해 처리됩니다. 이러한 예외는 처리되는 예외이므로 처리되지 않는 두 번째 예외가 되지 않으며 프로세스를 종료시키지 않습니다.

첫 번째 EH와 알 수 없는 예외에 대해 고유한 작은 메모리 덤프를 생성하도록 ADPlus를 구성할 수도 있습니다. 이렇게 하려면 구성 파일을 사용하여 ADPlus를 사용자 지정해야 합니다.

두 번째 예외

ADPlus는 EH와 알 수 없는 예외를 포함하여 모든 유형의 치명적인 두 번째 예외를 감지하면 다음 동작을 수행합니다.
  1. 프로세스를 일시 중지하여 모니터링 중인 프로세스에 예외가 발생한 날짜와 시간을 로그 파일에 기록합니다.
  2. 모니터링 중인 프로세스에 대해 예외가 발생한 스레드의 스레드 ID와 호출 스택을 로그 파일에 기록합니다.
  3. 치명적인 예외 발생 시 프로세스에 대한 전체 메모리 덤프를 생성한 다음 디버거를 종료합니다. 이 동작은 프로세스를 소멸시킵니다.
참고 Microsoft PSS 지원 담당자가 메모리 덤프를 분석할 때 사용자 지정 구성 요소나 DLL의 복사본 및 해당 기호 파일이 필요할 수 있습니다. 사용자 DLL에 대한 기호 파일을 만드는 방법은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
121366  (http://support.microsoft.com/kb/121366/ ) INFO: PDB 및 DBG 파일 - 파일 정의 및 작동 방법
291585  (http://support.microsoft.com/kb/291585/EN-US/ ) HOWTO: Visual C++ 응용 프로그램에 대한 디버그 기호 만들기
디버거를 사용하여 메모리 덤프를 분석할 때 Microsoft 제품에 대한 기호를 얻는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx (http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx)
 

ADPlus 명령줄 스위치

ADPlus를 사용하려면 스크립트에 일련의 명령줄 스위치나 인수를 지정해야 합니다. 최소한 ADPlus에는 작동 모드를 지정하는 스위치와 작동 대상 프로세스를 지정하는 스위치가 필요합니다.

다음은 가장 자주 사용되는 스위치입니다. ADPlus –help를 실행하거나 디버거 도움말 파일(Debugger.chm)에서 스위치 전체 목록을 볼 수 있습니다.
  • -hang
    이 스위치는 중지 모드에서 실행되도록 ADPlus를 구성합니다. 이 스위치는 -iis, -pn 또는 -p 스위치와 함께 사용해야 합니다. -hang-crash 스위치와 함께 사용할 수 없습니다.

    참고 ADPlus를 중지 모드에서 실행 중이면 프로세스가 중단되거나 CPU를 많이 사용한 후에 ADPlus를 시작해야 합니다.
  • -crash
    이 스위치는 충돌 모드에서 실행되도록 ADPlus를 구성합니다. 이 스위치는 -iis, -pn 또는 -p 스위치와 함께 사용해야 합니다. -crash-hang 스위치와 함께 사용할 수 없습니다.

    참고 ADPlus가 충돌 모드에서 실행 중이면 프로세스가 예기치 않게 종료되거나 불안정해지기 전에 ADPlus를 시작해야 합니다.
  • -pn process name
    -pn 스위치는 ADPlus에서 분석할 프로세스 이름을 지정하는 데 사용됩니다. 프로세스를 여러 개 지정하려면 -pn process name 스위치를 여러 번 사용합니다. 예를 들어 다음과 같이 지정합니다.
    -pn process1.exe -pn process2.exe
  • -p process ID
    -p 스위치는 ADPlus에서 분석할 프로세스 ID(PID)를 지정하는 데 사용됩니다. 프로세스를 여러 개 지정하려면 -p PID 스위치를 여러 번 사용합니다. 예를 들어 다음과 같이 지정합니다.
    -p 1896 -p 1702
  • -iis
    -iis 스위치는 Internet Information Server(IIS) 4.0 이상을 실행하는 서버 컴퓨터를 디버깅하는 데 사용됩니다. -iis 스위치와 함께 사용하면 ADPlus는 모든 IIS in-process(Inetinfo.exe)와 out-of-process(Mtx.exe/Dllhost.exe) 응용 프로그램을 모니터링합니다. -iis 스위치는 -pn 스위치나 -p 스위치와 함께 사용하거나 단독으로 사용하여 충돌 모드 또는 중지 모드에서 IIS와 실행 중인 모든 MTS/COM+ 응용 프로그램을 분석할 수 있습니다.

    IIS 3.0 이하 버전을 실행하는 서버 컴퓨터를 분석할 경우에는 -pn 스위치를 사용하고 모니터링할 프로세스로 Inetinfo.exe를 지정하십시오.
  • -notify computer name 또는 user name
    이 스위치는 ADPlus가 충돌 모드에서 실행될 때만 유효합니다. 이 스위치를 사용하면 ADPlus는 충돌한 특정 사용자 이름이나 컴퓨터 이름을 경고합니다. 두 번째 예외로 인해 디버거가 프로세스에서 분리되거나 사용자가 Ctrl+C를 눌러 디버깅을 중지하면 로컬 메신저 서비스를 통해 원격 사용자나 컴퓨터로 알림 메시지가 보내집니다. 이 알림은 디버깅하는 컴퓨터에서 로컬 메신저 서비스가 시작된 경우에만 발생합니다.
  • -quiet
    이 스위치를 사용하면 ADPlus는 모든 모달 대화 상자를 표시하지 않습니다. 이 스위치는 모달 대화 상자에서 사용자가 확인을 누를 때까지 ADPlus를 무한정 대기하도록 할 수 있는 원격 명령 셸에서 ADPlus를 실행하는 경우 유용합니다. 최상의 결과를 얻으려면 이 스위치가 ADPlus.vbs에 전달되는 첫 번째 스위치여야 합니다.
  • -o output directory
    이 스위치는 ADPlus가 디버그 출력 파일을 저장할 위치를 알려 줍니다. 파일 이름을 길면 큰 따옴표로 묶어 주어야 합니다. UNC 경로(\\server\share)를 사용할 수도 있습니다. UNC 경로를 사용하면 ADPlus는 지정한 UNC 경로 바로 아래에 새 폴더를 만듭니다. 폴더는 ADPlus가 실행 중인 서버 이름입니다. 예를 들어 \\server\share\Web1 또는 \\server\share\Web2입니다. 이 스위치는 동일한 네트워크 공유에 모든 출력을 저장하는 웹 팜의 여러 컴퓨터에서 ADPlus를 실행하는 경우 유용합니다.
처음으로 ADPlus 실행
기본적으로 디버거는 Windows의 C:\Program Files\Debugging Tools 폴더에 설치됩니다. 설치 폴더를 변경하려면 디버거를 설치할 때 사용자 지정 설치를 수행하고 다른 폴더를 지정합니다. 또는 표준 설치를 수행한 경우 Program Files\Debugging Tools for Windows 폴더의 내용을 다른 폴더로 복사하면 됩니다.

ADPlus를 실행하려면 명령 셸을 열고 디버거를 설치했거나 복사한 폴더로 전환한 다음 ADPlus.vbs를 입력합니다.

기본 스크립트 인터프리터를 Wscript.exe에서 Cscript.exe로 변경하라는 메시지가 나타날 수 있습니다. ADPlus에서 CSCript를 기본 스크립트 인터프리터로 구성하는 것이 좋습니다.

구문

ADPlus는 다음 구문을 사용합니다.
ADPlus.vbs mode of operation processes to monitor optional switches
여기서 mode of operation-hang 또는 -crash
processes to monitor-iis, -pn process.exe 또는 -p PID
optional switches-notify, -o 또는 -quiet입니다.

 

충돌 모드 디버깅을 위해 서버 준비

충돌 모드에서 ADPlus를 실행하기 전에 ADPlus 충돌 모드 디버깅 세션에서 대부분의 정보를 얻도록 서버를 적절히 준비해야 합니다.

충돌 모드에서 디버깅을 위해 Windows 2000 기반 서버를 준비하는 단계

  1. Windows 2000 SP1이나 SP2 기호를 서버에 있는 C:\WINNT\Symbols 폴더에 설치합니다. 기호는 다음 Microsoft 웹 사이트에서 다운로드할 수 있습니다.
    Windows 2000 SP1
    http://www.microsoft.com/korea/windows2000/downloads/servicepacks/sp1/debug/default.asp (http://www.microsoft.com/korea/windows2000/downloads/servicepacks/sp1/debug/default.asp)

    Windows 2000 SP2
    http://www.microsoft.com/korea/windows2000/downloads/servicepacks/sp2/debug/default.asp (http://www.microsoft.com/korea/windows2000/downloads/servicepacks/sp2/debug/default.asp) Sp1sym.exe나 Sp2sym.exe를 다운로드한 후에 지정된 폴더에서 파일을 실행합니다.
  2. 프롬프트가 나타나면 C:\Sp1sym 또는 C:\Sp2sym과 같은 새로운 임시 폴더나 디스크 공간이 충분한 드라이브 또는 폴더로 파일을 추출합니다.
  3. C:\Sp1sym\Support\Debug\Symbols\i386\Symbols_sp.exe 또는 C:\Sp2sym\Support\Debug\Symbols\i386\Symbols_sp.exe를 실행합니다. 여기서 C:\Sp1sym 또는 C:\Sp2sym은 앞 단계에서 파일을 추출한 폴더입니다.
  4. License가 표시되면 Yes를 누릅니다.
  5. 파일을 추출할 폴더를 묻는 메시지가 나타나면 C:\WINNT\Symbols를 누른 다음 확인을 누릅니다. 새 C:\WINNT\Symbols 폴더가 나타납니다. 이 폴더에는 DLL, EXE 등 여러 하위 폴더가 들어 있습니다.
  6. 사용자 지정 DLL의 기호와 SP1이나 SP2 이후 핫픽스를 C:\WINNT\Symbols\Dll 폴더로 복사합니다.
  7. 사용자 지정 .exe 파일의 기호를 C:\WINNT\Symbols\Exe 폴더로 복사합니다. 또한 개발자로부터 .pdb나 .dbg 파일을 구해 C:\WINNT\Symbols\Dll 폴더에 저장해야 합니다.
  8. C:\WINNT\Symbols\Dll 폴더에 이미 있는 .dbg나 .pdb 파일을 핫픽스의 버전으로 덮어씁니다.

    참고 Winzip 최신 버전을 사용하여 핫픽스 패키지를 열 수 있습니다. \Debug 하위 폴더에서 기호를 추출할 수 있습니다. \Debug 하위 폴더는 각 핫픽스 자동 설치 프로그램에 포함되어 있습니다.
  9. _NT_SYMBOL_PATH 환경 변수를 만들고 C:\WINNT\Symbols와 동일하게 설정합니다. 이 변수는 시스템 변수나 사용자 환경 변수일 수 있습니다.

충돌 모드에서 디버깅을 위해 Windows NT 4.0 기반 서버를 준비하는 단계

  1. Windows NT 4.0 서비스 팩 6a를 실행하고 있다고 가정하고 Windows NT 4.0 SP6a 기호를 서버에 있는 C:\WINNT\Symbols 폴더에 설치합니다. 기호를 다운로드하려면 아래의 Microsoft 웹 사이트를 방문하십시오.
    http://www.microsoft.com/korea/ntserver/nts/downloads/recommended/SP6/debug/default.asp (http://www.microsoft.com/korea/ntserver/nts/downloads/recommended/SP6/debug/default.asp)
    Sp6symi.exe를 다운로드한 후에 지정된 폴더에서 실행합니다.
  2. 프롬프트가 나타나면 C:\WINNT 폴더로 파일을 추출하거나 기호가 C:\WINNT에 설치되지 않은 경우 적절한 \WINNT 폴더로 대체합니다. 새 C:\WINNT\Symbols 폴더가 나타나며 이 폴더에는 DLL, EXE 등 다양한 하위 폴더가 들어 있습니다.
  3. C:\WINNT\Symbols\IIS4 폴더의 하위 폴더를 C:\WINNT\Symbols로 복사합니다. 모든 파일을 덮어쓸 것인지 물으면 를 누릅니다.
  4. 사용자 지정 DLL의 기호와 SP6a 이후 핫픽스를 C:\WINNT\Symbols\Dll 폴더로 복사합니다.
  5. 사용자 지정 .exe 파일의 기호를 C:\WINNT\Symbols\Exe 폴더로 복사합니다. 또한 개발자로부터 .pdb나 .dbg 파일을 구해 C:\WINNT\Symbols\Dll 폴더에 저장해야 합니다.
  6. C:\WINNT\Symbols\Dll 폴더에 이미 있는 .dbg나 .pdb 파일을 핫픽스의 버전으로 덮어씁니다.

    참고 Winzip 최신 버전을 사용하여 핫픽스 패키지를 열 수 있습니다. \Debug 하위 폴더에서 기호를 추출할 수 있습니다. 이 하위 폴더는 각 핫픽스 자동 설치 프로그램에 포함되어 있습니다.
  7. _NT_SYMBOL_PATH 환경 변수를 만들고 C:\WINNT\Symbols와 동일하게 설정합니다. 이 변수는 시스템 변수나 사용자 환경 변수일 수 있습니다.
반드시 디버깅 중인 서버에 기호를 다운로드하고 설치할 필요는 없지만 이렇게 하는 것이 좋습니다. 서버에 기호를 다운로드하고 설치하는 경우 로그 파일에서 캡처한 출력이 Microsoft PSS에서 분석할 때 훨씬 도움이 됩니다.

Microsoft 디버그 기호를 구하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
268343  (http://support.microsoft.com/kb/268343/ ) Umdhtools.exe: Umdh.exe를 사용하여 메모리 누수를 찾는 방법
서버를 구성한 후에 충돌 모드에서 ADPlus를 실행할 수 있습니다. 이 모드는 "일반적인 ADPlus 사용 시나리오" 절에서 자세히 설명합니다.
 

일반적인 ADPlus 사용 시나리오

이 절에서는 ADPlus를 실행해야 할 수 있는 몇 가지 일반적인 시나리오에 대해 설명합니다.

프로세스가 응답을 중지하거나 CPU를 100% 사용

이 시나리오에서 프로세스는 일정 기간 동안 또는 무한정 CPU를 100% 사용할 수 있습니다. 문제가 발생한 후에 중지 모드에서 ADPlus를 실행하여 CPU를 소모하는 프로세스의 메모리 덤프를 구하십시오. 예를 들어 다음 명령 구문 중 하나를 사용합니다.
ADPlus -hang -p 1896
이 명령은 중지 모드에서 ADPlus를 실행하고 PID가 1896인 프로세스의 전체 메모리 덤프 파일을 생성합니다.

ADPlus -hang -pn myapp.exe
이 명령은 중지 모드에서 ADPlus를 실행하고 이름이 Myapp.exe인 모든 프로세스의 전체 메모리 덤프 파일을 생성합니다.

ADPlus -hang -iis -pn myapp.exe -o c:\temp
이 명령은 중지 모드에서 ADPlus를 실행하고 IIS, Mtx.exe나 Dllhost.exe의 모든 인스턴스 및 이름이 Myapp.exe인 모든 프로세스의 전체 메모리 덤프 파일을 생성합니다. 그런 다음 덤프 파일을 C:\Temp 폴더에 저장합니다.
CPU를 100% 사용하는 상태에서 중지 모드로 ADPlus를 실행하면 이 도구는 명령줄에 지정된 프로세스의 메모리 덤프 파일을 생성합니다.

참고 CPU를 100% 사용하는 상태가 되거나 프로세스가 중지된 후에 디버거가 프로세스에 연결하지 못하는 경우가 간혹 있습니다. 문제가 발생한 후에 중지 모드에서 ADPlus를 실행하면 도구가 메모리 덤프 파일을 생성할 수 없습니다. 이 시나리오에서는 문제가 발생하기 전에 디버거를 연결하는 것이 가장 좋은 방법일 수 있습니다. 이렇게 하려면 다음 명령 구문 중 하나를 사용하여 충돌 모드에서 ADPlus를 실행하십시오.
ADPlus -crash -p 1896
이 명령은 PID가 1896인 프로세스에 대해 충돌 모드에서 ADPlus를 실행하며, 예외가 발생하거나 사용자가 최소화된 디버거 창에서 Ctrl+C를 눌러 메모리 덤프 파일을 생성하고 디버거를 분리하기를 기다립니다.

ADPlus -crash -pn myapp.exe
이 명령은 이름이 Myapp.exe인 프로세스에 대해 충돌 모드에서 ADPlus를 실행하며, 예외가 발생하거나 사용자가 최소화된 디버거 창에서 Ctrl+C를 눌러 메모리 덤프 파일을 생성하고 디버거를 분리하기를 기다립니다.

ADPlus -crash -iis -pn myapp.exe -o c:\temp
이 명령은 이름이 Myapp.exe 또는 Inetinfo.exe인 프로세스의 모든 인스턴스와 Mtx.exe 또는 Dllhost.exe의 모든 인스턴스에 대해 충돌 모드에서 ADPlus를 실행하며, 예외가 발생하거나 사용자가 최소화된 디버거 창 중 하나에서 Ctrl+C를 눌러 메모리 덤프 파일을 생성하고 디버거를 분리하기를 기다립니다. ADPlus는 메모리 덤프 파일과 로그 파일을 C:\Temp 폴더에 저장합니다.
그런 다음 프로세스가 중지되거나 CPU를 100% 사용하게 된 디버거가 프로세스에 대한 메모리 덤프 파일을 생성할 수 있도록 사용자가 최소화된 디버거 창에서 Ctrl+C를 누를 수 있습니다.

참고 기본적으로 ADPlus는 사용자가 Ctrl+C를 누를 때 작은 메모리 덤프 레코드만 생성합니다. 이 설정은 디스크 공간을 절약합니다. 이 시나리오에서는 사용자가 Ctrl+C를 누를 때 전체 메모리 덤프 파일을 생성하도록 ADPlus를 구성하는 것이 유용할 수 있습니다. 이렇게 하려면 –CTCF 스위치를 사용하십시오. 또한 CPU 사용이 100%가 되는 상태를 포함하여 일정 기간 동안 성능 로그 파일이나 시스템 모니터 로그 파일을 캡처하는 것이 종종 도움이 됩니다. 최소한 이 로그 파일은 1초에서 5초 간격으로 다음 개체를 캡처해야 합니다.
  • 메모리
  • 프로세스
  • 프로세서
  • 시스템
  • 스레드

프로세스가 예기치 않게 종료

이 시나리오에서는 프로세스가 예기치 않게 종료되거나 충돌할 수 있습니다. 충돌 모드에서 ADPlus를 실행하여 문제가 발생하기 전에 종료되는 프로세스의 메모리 덤프 파일을 구하십시오. 예를 들어 다음 명령 구문 중 하나를 사용합니다.
ADPlus -crash -iis
이 명령은 충돌 모드에서 ADPlus를 실행하며 컴퓨터에서 실행 중인 모든 Mtx.exe 또는 Dllhost.exe 프로세스와 Inetinfo.exe에 CDB 디버거를 연결합니다. 그러면 ADPlus는 첫 번째와 두 번째 예외가 발생하기를 기다립니다. 기본적으로 ADPlus는 -o 스위치가 생략되었기 때문에 설치 폴더의 하위 폴더에 모든 파일을 저장합니다.

ADPlus -quiet -crash -iis -notify remote computer -o c:\temp
이 명령은 충돌 모드에서 ADPlus를 자동으로 실행하며(대화 상자 없이 모든 출력이 이벤트 로그에 기록) 컴퓨터에서 실행 중인 모든 Mtx.exe 또는 Dllhost.exe 프로세스와 Inetinfo.exe에 CDB 디버거를 연결합니다. -notify 스위치를 사용하기 때문에 디버거는 충돌이 감지되거나 모니터링 중인 프로세스가 종료될 때마다 remote computer 컴퓨터에 로그온한 모든 사용자에게 알립니다. -o 스위치를 사용하기 때문에 ADPlus는 모든 출력을 C:\Temp 폴더에 저장됩니다. 폴더가 없으면 ADPlus가 새로 만듭니다.

ADPlus -crash -iis -o \\server\share
이 명령은 모든 출력을 네트워크 서버에 기록하는 것을 제외하면 앞의 명령과 같습니다. ADPlus는 \\server\share에 새 하위 폴더를 만들고 로컬 컴퓨터의 하위 폴더로 이름을 지정합니다. 따라서 웹 팜에서 ADPlus를 실행 중인 경우 ADPlus를 실행하는 팜의 각 서버는 \\server\share 아래의 고유한 폴더에 기록합니다. 각 서버에 대해 고유한 폴더를 만들 필요는 없으며 자동으로 만들어집니다.
참고 로컬 콘솔에서 충돌 모드로 ADPlus를 실행 중인 경우 다음 절에서 설명하는 원격 명령 셸 대신 디버그 세션 기간 동안 콘솔에 로그온해 있어야 합니다.

예를 들어 충돌 모드에서 ADPlus를 시작하고 -iis 스위치를 사용하여 IIS를 모니터링한다고 가정합니다. 콘솔에서 로그아웃하면 콘솔에서 실행 중인 Cdb.exe의 복사본과 실행 중인 다른 모든 응용 프로그램이 종료됩니다. 결과적으로 디버깅이 중단되고 모니터링 중인 프로세스가 종료됩니다.

이런 문제를 방지하려면 Ctrl+Alt+Del을 누른 다음 컴퓨터 잠금을 눌러 콘솔 세션을 잠그거나 대화형 로그온이 필요 없는 비대화형으로 실행하도록 예약된 원격 명령 셸에서 ADPlus를 실행할 수 있습니다.

비대화형으로 실행하도록 원격 명령 셸을 예약하는 방법에 대한 자세한 내용은 "일반적인 ADPlus 사용 시나리오: 원격으로 충돌 모드에서 ADPlus 실행" 절을 참조하십시오.

MTS 또는 COM+ 서버 응용 프로그램이 예기치 않게 종료

MTS나 COM+ 서버 응용 프로그램에서 실행되는 COM(사용자 지정 구성 요소 개체 모델) 구성 요소는 실제로 대리 프로세스(Mtx.exe 또는 Dllhost.exe)에서 실행됩니다. 이 대리 프로세스의 속성과 설정은 MTS Explorer(Windows NT 4.0)나 구성 요소 서비스 Microsoft Management Console(MMC) 스냅인(Windows 2000, Windows XP 및 Windows Server 2003)을 통해 구성할 수 있습니다.

기본적으로 MTS나 COM+ 서버 응용 프로그램은 3분의 유휴 시간 후에 종료되도록 구성됩니다. 디버거가 연결되어 있는 동안 계속 실행되고 예외를 모니터링하도록 하려면 유휴 상태일 때도 실행되도록 구성해야 합니다.

또한 MTS와 COM+는 Failfast를 구현합니다. Failfast는 처리되지 않은 액세스 위반을 생성하는 MTS/COM+ 프로세스에 실패(종료)하도록 설계된 안전 장치입니다.

Failfast는 처리되지 않은 액세스 위반 예외를 발생시키는 MTS나 COM+ 응용 프로그램에서 기본적으로 사용됩니다. 따라서 실패하는 MTS/COM+ 서버 응용 프로그램은 두 번째 액세스 위반 예외를 발생시킬 수 없습니다. 즉, 첫 번째 액세스 위반이 발생한 후에 종료됩니다. 기본적으로 ADPlus는 첫 번째 예외가 발생할 때 작은 메모리 덤프 레코드만 생성하도록 구성됩니다.

MTS/COM+ 서버 응용 프로그램을 성공적으로 디버깅하려면 다음과 같이 하십시오.
  1. 유휴 상태일 때도 실행되도록 MTS/COM+ 서버 응용 프로그램을 구성합니다.
  2. FullOnFirst 스위치를 사용하여 첫 번째 예외에서 전체 덤프 파일을 만듭니다.
  3. 충돌 모드에서 ADPlus를 실행하고 응용 프로그램이 실패하기를 기다립니다.
참고 MTS와 COM+는 서버 응용 프로그램을 종료하고 Failfast 정책으로 프로세스는 두 번째 예외를 발생시킬 수 없기 때문에 첫 번째 액세스 위반 메모리 덤프 파일만 얻을 수 있습니다.

원격으로 충돌 모드에서 ADPlus 실행

서버 팜에 있는 하나 이상의 원격 서버에서 예기치 않게 종료되는 프로세스를 모니터링하기 위해 로컬 클라이언트 컴퓨터에서 충돌 모드로 ADPlus를 시작해야 하는 경우가 많습니다. 일반적으로 Windows 2000에서는 Windows 터미널 서비스를 통해 이 작업을 수행할 수 있습니다. 그러나 Windows NT 4.0과 Windows 2000에서는 다른 창 스테이션에서 실행되는 응용 프로그램을 디버깅할 수 없기 때문에 ADPlus는 터미널 서비스 세션에서 실행 중인 것을 감지하면 충돌 모드 기능을 해제합니다. 이 문제를 해결하려면 Remote.exe 유틸리티를 사용하여 원격 서버를 공유하고 원격 서버에서 명령 셸을 시작하는 배치 파일을 만든 다음 AT 명령을 사용하여 대상 서버에서 실행되도록 이 배치 파일을 예약합니다. AT 명령은 명령 셸이 서비스와 비슷하게 비대화형으로 실행되도록 합니다. 그러면 원격 명령 셸은 시작하는 데 사용되었던 것과 동일한 Remote.exe 유틸리티를 사용하는 로컬 워크스테이션이나 클라이언트 컴퓨터에 연결됩니다.

AT 명령을 사용하여 서버에서 원격 명령 셸을 시작하려면 다음과 같이 하십시오.
  • 원격 서버
    디버거가 C:\Debuggers에 설치되었다고 가정하고 다음과 같이 하십시오.
    1. C:\Debuggers 폴더에 Remoteshell.cmd라는 새 배치 파일을 만듭니다.
    2. 이 배치 파일에 다음 줄을 추가합니다.
      c:\debuggers\remote.exe /s "cmd.exe" remoteshell
    3. 서버에 있는 콘솔이나 터미널 서비스 세션에서 새 명령 셸을 열고 다음 명령을 입력합니다.
      AT 15:00 c:\debuggers\remoteshell.cmd
      15:00은 현재 시간 보다 1분이 늦습니다. 예를 들어 현재 시간이 14:59인 경우 15:00을 입력합니다.
    4. AT 명령이 실행되기를 기다립니다.
    5. 명령 프롬프트에 매개 변수 없이 AT를 입력하여 작업이 오류 없이 실행되는지 확인합니다.
  • 로컬 클라이언트:
    로컬 클라이언트 컴퓨터에 디버거를 설치하거나 최소한 Remote.exe 유틸리티를 로컬로 복사합니다. 이 유틸리티는 기본적으로 루트 설치 폴더에 디버거와 함께 설치됩니다.

    디버거와 Remote.exe 유틸리티가 C:\Debuggers에 설치되었다고 가정하고 다음과 같이 하십시오.
    1. 명령 프롬프트에서 C:\Debuggers 폴더로 전환합니다.
    2. 다음 명령을 입력합니다.
      remote.exe /c remote server remoteshell
      여기서 remote server는 원격 서버 이름입니다.
    3. 로컬 명령 셸이 서버에서 실행되는 원격 명령 셸에 연결되고 사용자가 로컬로 입력하는 모든 명령은 원격 서버에서 수행됩니다. DIR c:\ 명령은 원격 서버의 C 드라이브 내용을 나열합니다.
    4. 콘솔에서 로컬로 실행하는 것처럼 원격 명령 셸에서 ADPlus를 충돌 모드로 실행할 수 있습니다. 그러나 -quiet 스위치를 사용하여 기본적으로 ADPlus에서 모든 대화 상자가 표시되지 않도록 해야 합니다. -quiet 스위치를 사용하지 않고 ADPlus를 실행하면 원격 명령 셸이 응답을 중지하고 프롬프트로 돌아가지 않습니다. 이 문제가 발생하면 서버에서 원격 명령 셸(Cmd.exe)을 종료한 다음 새 인스턴스를 시작해야 합니다.
    5. ADPlus가 현재 원격으로 충돌 모드를 통해 디버깅 중인 프로세스로 디버그 중단(Ctrl+C) 명령을 보내려면 Breakin.exe 유틸리티를 사용해야 합니다. Breakin.exe는 기본적으로 디버거 폴더의 루트에 디버거와 함께 설치됩니다. 예를 들어 프로세스 ID가 1975로 실행되는 IIS(Inetinfo.exe) 디버깅을 중단하려면 원격 명령 셸에서 다음 명령을 입력합니다.
      breakin.exe 1975
      또는 루트 디버거 폴더에 있는 Kill.exe 명령을 사용하여 디버깅 중인 프로세스를 종료할 수 있습니다.

추가 정보 및 알려진 문제

  • ADPlus가 충돌에 대한 정보를 캡처했는지 또는 충돌 모드에서 모니터링 중인 프로세스가 종료되었는지 어떻게 확인합니까?

    이 문제를 확인하는 방법은 여러 가지가 있습니다.
    • -notify 스위치를 사용하고 디버깅 중인 서버와 알림을 받을 클라이언트 컴퓨터에서 메신저 서비스가 시작되었는지 확인합니다.
    • 텍스트 편집기에서 각 프로세스에 대한 출력 폴더에 나타나는 .log 파일을 열고 파일 끝으로 스크롤합니다. 다음 텍스트를 찾습니다.
           0:070> * -------- AutodumpPlus 4.01 finished running at: --------
           0:070> .time
           Debug session time: Mon Aug 06 15:25:15 2001
           System Uptime: 3 days 17:00:34 
           Process Uptime: 1 days 3:10:38
           0:070> * -------------------------------------------------------
    • 출력 폴더에서 "__2nd_chance"라는 구문이 포함된 .dmp 파일을 찾습니다. 메모리 덤프 레코드의 레이블에 이 구문이 나타나면 프로세스가 예기치 않게 종료된 것입니다.
    • 출력 폴더에서 "__Process_was_shutdown"라는 구문이 포함된 .dmp 파일을 찾습니다. 메모리 덤프 레코드의 레이블에 이 구문이 나타나면 관리자가 프로세스를 종료한 것이며, MTS/COM+ 응용 프로그램인 경우 유휴 제한 시간에 도달하여 종료된 것입니다.
    • 출력 폴더에서 "__CTRL-C"라는 구문이 포함된 .dmp 파일을 찾습니다. 메모리 덤프 레코드의 레이블에 이 구문이 나타나면 프로세스에서 실행 중인 DLL에서 디버그 중단 예외가 발생했거나 누군가 현재 디버깅 세션을 중지하기 위해 콘솔에서 Ctrl+C(ADPlus를 원격으로 실행 중인 경우 Breakin.exe 사용)를 누른 것입니다.
  • ADPlus를 실행하려면 Windows 스크립트 호스트 구성 요소를 시스템에 설치해야 합니다. Windows 스크립트 호스트를 다운로드하려면 다음 Microsoft 웹 사이트를 방문하십시오.
    http://msdn2.microsoft.com/en-us/library/ms950396.aspx (http://msdn2.microsoft.com/en-us/library/ms950396.aspx)
    참고 다음 Microsoft 제품이 설치된 경우 Windows 스크립트 호스트 구성 요소가 이미 설치되어 있을 수 있습니다.
    • Microsoft Internet Explorer 5
    • Microsoft Office 2000
    • Microsoft Visual InterDev 6.0
    • Microsoft Visual Studio 6.0
    • Microsoft Windows NT Option Pack
    • Microsoft Windows 2000
  • -iis 스위치는 Internet Information Server(IIS) 4.0이나 인터넷 정보 서비스(IIS) 5.0.x가 설치된 경우에만 작동합니다.
  • 자동 모드에서 ADPlus를 실행하면 도구는 정보를 이벤트 로그에 기록합니다.
  • -o 스위치를 사용하는 경우 지정된 경로는 둘 이상의 존재하지 않는 폴더를 포함해서는 안 됩니다. 예를 들어
    1. -o c:\temp1\temp2를 지정하는 경우 C:\Temp1 및 \Temp2 폴더가 없으면
    2. ADPlus는 폴더가 없다는 오류 메시지를 표시하고 폴더를 새로 만들지 않습니다.
    -o c:\temp1만 지정하면 ADPlus는 폴더가 없는 경우 C:\Temp1 폴더를 만들고 해당 폴더에 모든 출력 파일을 저장합니다. 여러 하위 폴더를 지정하고 -o 스위치를 사용하려면 ADPlus를 실행하기 전에 모든 하위 폴더가 있는지 확인합니다.
  • COM+에서 패키지의 속성 대화 상자에 있는 고급 탭에서 디버거를 시작하도록 서버 패키지를 구성할 수 있습니다. 디버거 시작 옵션을 사용하는 경우 ADPlus는 CDB 디버거를 프로세스에 연결할 수 없습니다. 기본적으로 한 번에 한 프로세스에 한 디버거만 연결할 수 있습니다.
  • ADPlus가 충돌 모드에서 분석 중인 프로세스에서 의도적이거나 예기치 않게 종료된 다른 프로세스로 RPC(원격 프로시저 호출)를 수행할 때 ADPlus가 분석 중인 프로세스에 대해 만드는 로그 파일은 다음 예외를 하나 이상 포함할 수 있습니다.
    Unknown exception - code 80010105 (first chance)
    Unknown exception - code 800706be (first chance)
    Unknown exception - code 800706ba (first chance)
    이러한 예외는 일반적인 것입니다. RPC는 모니터링 중인 프로세스에서 존재하지 않거나 실패한 프로세스로 호출을 수행할 때 이런 예외를 발생시킵니다.

    뿐만 아니라 ADPlus가 해당 프로세스에 대한 ADPlus 디버그 로그에서 Inetinfo.exe를 모니터링 중인 경우 다음 예외가 로그에 나타날 수 있습니다.
    Unknown exception - code 800706bf (first chance)
    이 예외는 IIS가 실패한 out-of-process(높은 격리 수준) 웹 사이트를 호출한 후에 일반적으로 나타납니다. 그런 후 다음 예외의 두 인스턴스가 나타날 수 있습니다.
    Unknown exception - code 800706ba (first chance)
Comments