Tech & IT/프로그래밍

HOWTO: VC++에서 기계어 코드 Visual Basic 구성 요소를 디버깅하는 방법

해피콧 2008. 12. 4. 15:46
'); }
'); }
출처 : http://support.microsoft.com/kb/166275/ko

기술 자료 ID: 166275 - 마지막 검토: 2003년 8월 19일 화요일 - 수정: 1.1

HOWTO: VC++에서 기계어 코드 Visual Basic 구성 요소를 디버깅하는 방법

이 문서는 이전에 다음 ID로 출판되었음: KR166275

요약

코드를 .exe, .dll 또는 .ocx로 컴파일하기 전에 디자인 타임에서 Visual Basic 5.0 디버거를 사용하여 디버깅할 수 있습니다. Visual Basic으로 만든 COM 구성 요소를 디버깅할 때 동일한 Visual Basic 5.0 인스턴스에서 복수의 프로젝트를 실행하거나, Visual Basic 5.0의 한 인스턴스에서 클라이언트를 실행하고 다른 인스턴스에서 COM 구성 요소를 실행하는 등 별개의 Visual Basic 5.0의 인스턴스를 실행함으로써 프로세스 외부에서 COM 구성 요소를 디버깅할 수 있습니다. 

Visual Basic 5.0 디버거는 디자인 타임에서만 구성 요소를 디버깅하기 때문에 컴파일한 후에는 구성 요소를 Visual Basic 5.0 디버거에서 디버깅할 수 없습니다. 컴파일된 Visual Basic 구성 요소를 디버깅하려면 Visual C++ 5.0 디버거의 기능을 사용해야 합니다. 아래와 같은 경우에 컴파일된 Visual Basic 구성 요소를 디버깅해야 할 수도 있습니다.
  • Visual Basic 5.0이 아닌 컨테이너에서 사용하기 위해 ActiveX 컨트롤을 만드는 경우
  • 컴파일된 .dll만을 실행할 수 있는 Microsoft Transaction Server 같은 응용 프로그램 실행 환경인 경우
  • 디자인 타임에서 Visual Basic 구성 요소가 컴파일 시와 다르게 동작한다는 의심이 들 때
본 문서에서는 Microsoft Developer Studio 환경에서 Visual Basic 구성 요소를 디버깅하는 방법을 설명합니다. 아래에서 설명하는 예제를 수행하려면 개발용 컴퓨터에 Visual Basic 5.0과 Visual C++ 5.0을 설치해야 합니다.

추가 정보

아래의 단계를 수행하려면 디버깅할 표준 EXE(.exe), ActiveX DLL(.dll), ActiveX EXE(.exe) 또는 ActiveX 컨트롤(.ocx)을 Visual Basic 5.0에서 미리 만들어 두어야 합니다.
  1. 디버깅할 Visual Basic 프로젝트를 Visual Basic 5.0에서 엽니다. 파일 메뉴에서 프로젝트_이름.exe 만들기를 선택합니다. 옵션 단추를 누르고 컴파일 탭을 선택합니다.기계어 코드로 컴파일과 심볼 디버그 정보 만들기를 선택합니다. 확인을 누른 다음 다시 확인을 눌러 구성 요소를 컴파일합니다.
  2. Visual C++ 5.0 File 메뉴에서 Open Workspace를 선택합니다. Open Workspace 대화 상자에서 Files of Type을 All files(*.*)로 설정한 다음 컴파일된 구성 요소를 선택합니다.
  3. 이번에는 Visual C++ 5.0 File 메뉴에서 Open Workspace 대신 Open을 선택한 다음 디버깅할 Visual Basic 모듈(.bas), 폼(.frm) 또는 클래스(.cls)를 엽니다. 일반 프로그램을 디버깅할 때와 마찬가지로 중단점(F9), 조사식(Watch), 단계별 실행(Step-Through) 명령 등을 설정합니다. 또한, Visual C++ 5.0 Tools 메뉴에서Options를 선택한 다음 Debug 탭을 눌러 디버그 환경에서 변수 정보를 표시할 수도 있습니다. Debug 탭에서 Display unicode strings 확인란을 선택합니다. 

    별개의 스레드에 있는 변수는 조사할 수 없습니다. 그러한 예로 .ocx를 사용하는 백그라운드 스레드나 숨겨진 vb 백그라운드 스레드가 있습니다. Visual Basic 전역 변수는 아파트별(Per-apartment) 또는 단일 스레드(Single-thread)이므로 다른 스레드에 있는 전역 변수를 스택에서 볼 수 없습니다.
    1. 표준 EXE: Visual C++ 5.0의 Build 메뉴에서 Start Debug를 선택한 다음Go를 선택하거나 F5 키를 누릅니다. 컴파일된 Visual Basic 구성 요소가 Visual C++ 5.0에서 중단점이 설정된 줄까지 도달하여 실행이 중지된 후 일반적인 디버깅 작업을 수행할 수 있습니다.
    2. ActiveX EXE, DLL 또는 OCX: DLL의 경우에는 디버깅할 exe를 지정해야 한다는 점에서 약간 다릅니다. 이를 위해 Project 메뉴에서 Settings를 선택하고Debug 탭을 누릅니다. Executable for debug session 입력란에 .dll을 참조하는 .exe 파일을 지정합니다. 이제 실행 파일과 .dll을 시작하는 3a단계를 수행하여 Visual C++ 5.0 디버거가 실행되면 이 곳에서 .dll에 중단점을 설정할 수 있습니다.
    3. Microsoft Transaction Server(MTS) 하에서 실행하는 ActiveX DLL: 이 DLL을 설정하기 위해 Project 메뉴에서 Settings를 선택하고 Debug 탭을 누릅니다. Executable for debug session 입력란에 MTX.EXE를 지정합니다. 그런 다음 Program arguments 입력란에 /p:{00000000-0000- 0000-0000- 000000000000}을 입력합니다. 여기서 0들을 실제 MTS 패키지 ID로 바꾸어야 합니다. 패키지 ID는 트랜잭션 서버 탐색기에서 패키지의 등록 정보를 검사하여 알아낼 수 있습니다. 위의 3a단계를 수행하여 MTX.EXE 및 .dll을 시작합니다. 이제 MTS 하에 실행하는 COM 구성 요소를 호출하는 기본 클라이언트 .exe를 실행하면 Visual C++ 5.0 디버거가 실행되고 이곳에서 .dll에 중단점을 설정할 수 있습니다.
      1. MTS 하에서 디버깅을 수행할 때 아래와 같은 추가 유의 사항을 참고하십시오. 

      2. MTS 하에서 디버깅을 수행할 때 아래와 같은 추가 유의 사항을 참고하십시오. 호출되는 dll이 시스템 경로에 있습니까?
      3. MTS 하에서 디버깅을 수행할 때 아래와 같은 추가 유의 사항을 참고하십시오. 실수로 com 개체의 dll을 다시 등록하여 레지스트리에서 MTS 변경 사항이 제거되지는 않았습니까?
      4. MTS 하에서 디버깅을 수행할 때 아래와 같은 추가 유의 사항을 참고하십시오. com 개체의 dll 복사본을 여러 개 가지고 있고 로드되지 않은 dll 복사본에 중단점을 설정하지는 않았습니까?
      5. MTS 하에서 디버깅을 수행할 때 아래와 같은 추가 유의 사항을 참고하십시오. 이전의 3번과 마찬가지로 com이 아닌 개체의 dll 복사본이 여러 개 있지는 않습니까?
      6. MTS 하에서 디버깅을 수행할 때 아래와 같은 추가 유의 사항을 참고하십시오. 기호 정보를 가진 DLL을 MTS 디렉터리에 복사하고 이 디렉터리에서 그 DLL을 MTS 탐색기에 패키지로 복사해야 합니다. 이 방법은 매우 불합리한 것처럼 보이지만 이렇게 하지 않으면 MTS 구성 요소 내에서 기호 디버깅이 작동하지 않습니다. 

        또한, 디버거에서 mtx.exe 복사본을 시작하기 전에 실행 중인 모든 mtx.exe를 종료해야 합니다. mtx.exe를 시작할 때 제대로 실행됩니까 아니면 즉시 종료됩니까? MTS에 의해 기록된 이벤트 로그 메시지를 확인하십시오. 안전하게 처음부터 시작하려면 응용 프로그램을 완전히 삭제한 다음 다시 만들고 구성 요소의 dll 등을 다시 설치합니다.
    4. Internet Information Server(IIS) 하에서 실행하는 ActiveX DLL: IIS는 Windows NT 서비스로 실행되기 때문에 운영 시스템의 일부로 동작하기 위한 사용 권한이 필요합니다. 이를 위해 Windows NT 관리 도구에서 사용자 관리자를 선택합니다. Windows NT Server에서 도메인 사용자 관리자를 사용할 때는 파일 메뉴에서 도메인으로 컴퓨터 이름을 선택해야 합니다. 그런 다음 정책메뉴에서 사용자 권한을 선택합니다. 사용자 권한 정책 대화 상자에서 고급 사용자 권한 보기 확인란을 선택하고 콤보 상자에서 운영 체제의 일부로 동작을 선택합니다. 추가 단추를 누르고 입력란에 "domainxxx\userxxx"를 입력하거나 목록 상자에서 사용자 이름을 선택합니다. 확인을 누르고 나면 올바른 권한이 부여됩니다. Visual C++ 5.0에서 디버깅 세션을 시작하려면 Build 메뉴에서Start DebugAttach to Process를 차례로 선택합니다. Show System Processes 확인란을 선택한 다음 inetinfo를 선택하고 OK를 누릅니다. 이제 ActiveX 구성 요소를 호출할 클라이언트 .htm 또는 .asp 파일을 로드합니다. 앞에서 3단계를 수행했으면 이제 Visual Basic 코드를 단계적으로 실행할 수 있습니다.
Visual C++에서 프로세스 간에 또는 컴퓨터 간에 디버깅을 수행할 수도 있습니다. 디버거에서 실행하는 동안 디버깅 정보를 가진 .dll을 호출하면 자동으로 디버거의 또 다른 인스턴스와 디버깅할 수 있는 소스가 시작됩니다. 

.exe가 크기 또는 속도에 최적화되도록 컴파일될 때는 여러 줄의 불필요한 코드(Dead Code)가 프로젝트 외부에서 컴파일됩니다. 


본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
키워드: 
kbvbp500 kbvbp600 kbgrpvb kbusage KB166275