리모트 디버깅
2006/12/08 13:17

가끔 고객의 PC에서만 발생되는 버그를 Debugging 하기 위해서 고객을 방문해서 디버깅을 해야할때가 있다. 하지만 고객의 PC에 비주얼스튜디오를 설치 할수도 없고 설치한다고 한들 각종 환경설정은 어떻게 할것이냐 라는 문제에 봉착한다.
그나마 VC++6 이면 설치하는데 별문제가 없겠지만 NET 2005의 경우라면 아예 설치할 생각을 말아야 한다.
해서 리모트 디버깅을 해야 하는데 비주얼 스튜디오 버전에 따라 현지 사정에 따라 디버깅을 방법을 달리 해야 되는 경우가 많다.

리모트디버깅은 위에서 말한것처럼 꼭 고객의 PC 뿐 아니라 개발환경이 설치되지 않은 clean 한 상태에서 테스트용 디버깅과 UI로 local 디버깅의 불편함도 해소 한다는 점에서 많은 이점이 있다.

또한 이러한 방법들도 중요하지만 보다 중요한 것은 표준적인 디버깅환경이다. 같은 회사내에서도 다른 디버깅을 방법을 사용한다던가 개발자마다 다른 버전의 개발툴, 환경에서 오는 혼동도 무시 못한다. 먼저 이러한 부분에 있어서의 표준화가 먼저 되어야겠다.

디버깅을 하기 전에 아래 링크에서 리모트디버깅을 위한 서버설정을 위한 파일들을 다운받도록 한다.
http://hongyver.pe.kr/project/remotedbg.zip
위의 파일들은 VC6~2005, WinDBG용 서버용 파일들이 있다. 원하는 파일을 고객 또는 디버깅 해야할 PC로 복사하여 사용한다.

유저모드, 응용프로그램류를 디버깅할때
VC++6에서 디버깅
디버깅할 PC, 즉 고객의 PC에서 위에서 다운받은 파일중 msvcmon.exe(msvcmon.exe는 NET용이다.주의할것)를 실행시키면 아래와 같은 화면이 나온다.

Visual C++ Debug Monitor에서 Setting을 눌러 Target machine name or address에 개발자 PC의 IP 또는 컴퓨터 이름을 입력한다.
OK를 누르고 Connect를 누르면 Disconnecting 이라는 메세지가 나오면서 연결대기 상태가 된다. 이것으로 서버의 설정은 끝났다.
그럼 다음으로 개발자 PC에서는 Project의 Setting을 눌러 Debug 란 탭을 눌러 아래의 화면처럼 설정한다.
맨 아래의 Remote executable path and file name 란에 고객PC 또는 디버깅할 PC에 있는 디버깅할 파일명을 적는다. 상단의 Executable for debug session과 같은 파일명이다.
그리고 나서 F5를 눌러 디버깅을 눌러 실행하면 고객PC에서는 프로그램이 실행되고 개발자의 PC에서는 디버깅이 가능하다.

VS.NET 2005에서의 디버깅
서 디버깅할 PC, 즉 고객의 PC에서 위에서 다운받은 파일중 msvsmon.exe(vc8이란 디렉토리에 있다.)를 실행시키면 아래와 같은 화면이 나온다.
도구 -> 옵션을 눌러 위의 그림처럼 인증안함으로 설정하고 확인을 누르면 서버(고객PC 또는 디버깅할 PC)의 설정은 끝났다.

다음으로 개발자 PC에서 비주얼스튜디어2005를 실행시켜 소스를 읽어들인다음  도구->프로세스연결 을 눌러 아래화면으로 띄운다.
전송은 원격(네이티브 전용, 인증안함)으로 설정하고 한정자는 고객PC 또는 디버깅할 PC의 IP 번호 또는 컴퓨터이름을 입력하면 사용 가능한 프로세스 에 현재 고객PC 또는 디버깅할 PC의 프로세스들이 보인다. 이중 디버깅을 하고자 하는 프로세스를 클릭하고 연결을 누르면 디버깅이 가능하다. 그래서 원격지 PC에서 먼저 프로세스를 실행시켜야 두어야 한다.

WinDBG
고객PC 또는 디버깅할 PC에서 windbg.exe -server tcp:port=9090 (예시 포트번호) 로 수행한다.(바로가기를 만들어 속성에 추가해도 된다)
개발자PC에서는 windbg.exe -remote tcp:Port=9090,Server=vmxp 로 서버에 접속할수 있다.
아니면 아래의 그림처럼 메뉴의 File -> Connect to Remote Session 를 선택하여 Browse를 선택.
Machine에 컴퓨터 이름 또는 IP번호를 입력하고 refresh를 누르면 Servers에 서버가 뜬다.
서버를 클릭하여 접속한다.

여기까지 해서 WinDBG로 고객PC와 개발자PC가 접속이 되었다면 실제로 디버깅을 수행하기 위해서는 고객PC 또는 디버깅할 PC에서 File -> Attach to a Process 를 선택하여 디버깅할 프로세스를 선택하여야 한다.
비주얼 스튜디오에 비해 다소 불편하지만 보다 많은 정보와 폭 넓은 디버깅을 지원한다. 뿐만 아니라 꼭 TCP/IP 가 아닌 1394 나 시리얼을 통해서 디버깅이 가능하다.

커널모드, 디바이스드라이버류
SoftICE
설치후 CTRL+D 로 디버깅이 가능하다.
물론 Symblo Loader 라는 프로그램으로 디버깅하고자 하는 파일(EXE, DLL, SYS, DRV등등)을 File -> Open 한후  Module -> Load 를 수행하면 소스코드를 찾는데 이때 올바른 폴더를 지정해주면 CTRL+D 이후 디버깅에서 소스레벨의 디버깅이 가능하다.

WinDBG
설정방법은 아래 링크를 참조.
단 WinDBG의 커널 디버깅에서는 SoftICE와는 달리 EXE 또는 DLL 디버깅을 할수 없고 커널관련 모듈(SYS)만 가능하다.
역시 심볼설정을 통해 소스레벨의 디버깅이 가능하다.
http://www.debuglab.com/board_detail.aspx?id=98&table=lecture&pagenum=10

2006/12/08 13:17 2006/12/08 13:17
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • 우스 2007/02/01 00:18  댓글주소  수정/삭제  댓글쓰기
    안녕하세요^^;; 정말 좋은 정보인 것 같아서 담아가려구요^^;;
  • sunny 2007/06/25 11:53  댓글주소  수정/삭제  댓글쓰기
    넬름 퍼갔습니다. ;
  • 우왕... 2009/08/25 11:15  댓글주소  수정/삭제  댓글쓰기
    안녕하세요. 너무 좋은 내용이라 댓글 남기고 갑니다..잘 봤습니다.!!!!
    그런데 VS6.0 에서는 바로 F5 가 아니라 Build -> Debugger Remote Connection... 에서 Network (TCP/IP) -> Setting...부분에서 Target PC 의 IP를 입력해야 하는거 아닌가요? ^^;
    좋은 내용이라..제 블로그에 참조 했습니다 ^^;;

  • 정적링크와 동적링크 라이브러리 - lib 파일과 dll 파일
    2006/11/27 12:53

    Static Linked Library, 정적 링크 라이브러리

    컴파일시 실행파일에 라이브러리의 함수코드가 추가되어 작성되기 때문에 실행파일이 커지는 단점이 있으나 별도의 DLL이 필요없다.

    VC++6에서는 New Projects에 Win32 Static Library로 작성하고 2005에서는 Win32 콘솔 응용프로그램에서 정적라이브러리(미리 컴파일된 헤더 해제)를 선택하여 작성한다.
    명령줄에서 작성하려면 cl.exe /c /EHsc 파일명.cpp(/c 옵션은 링크없이 컴파일) 로 컴파일 하여 obj 파일 생성후 lib.exe ~.obj 으로 ~.lib 파일을 생성한다.

    만들어진 LIB(~.lib파일)과 ~.h(header파일)을 작성하고자 하는 Project 생성후라이브러리는 Project->Setting->Library modules에서 ~.lib를 추가하고 헤더는 원하는 코드에 추가하여 빌드한다.

    Dynamic Linked Libarary(DLL), 동적 링크 라이브러리

    우리가 흔히 말하는 DLLs 이다. 컴파일시 실행파일에 라이브러리의 함수코드를 넣지 않고 DLL 이라는 파일에 따로 두어 모듈화를 통해 관리와 테스트가 용이하며 공유를 통해 코드의 낭비를 줄이고 다국어버전등의 리소스교체를 용이하게 한다.

    New Projects에서 Win32 Dynamic-link library로 작성한다. 2005에서는 win32 응용프로그램작성에서 DLL 을 선택하면 된다.

    Header파일을 공통적으로 사용하기 위한 예시

    #ifdef _USRDLL
    #define DLLFunction  __declspec(dllexport)
    #elseif
    #define DLLFunction  __declspec(dllimport)
    #endif

    #ifdef __cplusplus
    extern “C” {
    #endif

    DLLFunction void somefunc();
    #ifdef __cplusplus
    }
    #endif


    ~.DEF 파일 
    예전에는 ~.def 파일을 통해 dll을 export 하였지만 VC++에서는 __declspec(dllexport)를 통해서 dll 의 함수들을 export한다. 반대로 import시에는 __declspec(dllimport)를 사용한다.

    LIBRARY              "TESTDLL.DLL"
    DESCRIPTION 'SIMPLEDLL Windows Dynamic Link Library'

    EXPORTS
      somefunc   @1


    Implicit Linkage, 암시적 링크
    LoadLibrary를 사용하지 않는다. 따라서 프로그램이 실행될때 dll이 로드된다.
    그러기 위해서는 Static Library와 같이 ~.lib파일과 ~.h 파일이 필요하고 실행시는 같은 폴더 또는 시스템폴더(dll을 찾는 정책에 따라)에 dll 파일이 존재하여야 한다. 없을시 찾을수 없다면 에러가 발생한다.
    dll을 생성하고 나면 생성된 폴더에 lib 파일도 같이 생성되는데 Static Library와는 달리 함수의 코드가 없다. 다만 함수형이 정의되어 있을뿐이다. 실행파일의 implict section에서 실행시 로드되어야 할 dll을 추가하여 나중에 프로그램이 실행되면 dll이 로드된다.

    Explicit Linkage,  명시적 링크
      LoadLibrary로 명시적으로 dll을 로드한다. GetProcAddress로 사용하고자 하는 함수의 주소를 얻어서 사용한다. dll이 load되는 시점은 프로그램이 실행되는 순간이 아니고 LoadLibrary가 호출되는 시점이다.

    Delay Linkage, 지연 링크
    빌드시 옵션에 /delayload:dllname 으로 작성한다.
    로드되는 시점은 프로그램 실행시가 아니라 함수가 사용되는 시점이 된다.
    /delay 옵션도 참고할것

    확장DLL
    MFC 클래스에서 파생된 재사용 가능한 클래스를 구현한 DLL. 따라서 MFC로 만든 응용 프로그램에서만 확장 DLL이 사용되어 질수 있다.
    이 DLL로부터 익스포트할 클래스에 대해서 여러분이 해줄일은 클래스 선언문에 AFX_EXT_CLASS란 매크로만 붙여준다.

    예시

    Class AFX_EXT_CLASS CDllDialog : public CDialog
    {
    ...
    }
    2006/11/27 12:53 2006/11/27 12:53
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다


    WinDBG에서 USB2.0 디버깅
    2006/11/01 09:59

    무지 편리할것 같아서...
    구글링을 해봤더니...

    일단 전용선이 필요한데다 국내 제작업체는 보이지 않는듯하고...
    제작하는 외국 업체도 Vista 만 지원한다니...

    결국 1394나 NullModem(COM1)으로 할수밖에 없구나...

    http://www.plxtech.com/products/NET2000/NET20DC/default.asp

    2006/11/01 09:59 2006/11/01 09:59
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다