출처 스크랩만을 위한 블로그 입니다. | 코니
원문 http://blog.naver.com/konny2020/40016672489

<리모트 디버깅 하기>

 일단 디버깅을 시작할 PC의 프로젝트 메뉴의 Setting 을 클릭합니다. 그 중 Debug tab 을 선택하면 Excutable for Debug Session 이 있는데, 이 란을 자신의 프로그램이 있는 디렉토리와 화일명을 쓰도록 합니다.

 두번째 란인 Working Directory 는 비워 놓습니다.

 세번째란은 Remote Executable path 로 상대방 pc ( 실행이 될 .. )에서 잡아놓은 내 가상 드라이브와 실행화일 명을 쓰도록 합니다. ( 일단 상대방에서 내가 디버깅을 실행할 디렉토리를 가상드라이브로 연결해야만 합니다. 그러기 위해선 당연히 네트워크상에서 그 디렉토리는 공유가 되어야만 하겠지요 )

  그 다음은 build 메뉴안에 debugger remote connection 을 선택합니다. 아마 local, network 등의 여러 connection type 이 있을 겁니다. 그 중 자신이 원하는 네트워크를 선택한후 setting 으로 자신의 실행화일이 실행이 될 상대방의 네트워크 주소를 기입합니다. 

 상대방 pc 에서 msvcmon.exe 화일을 띄어 놓습니다.(자주쓰이니 바탕화면에 바로가는 아이콘으로...) 물론 그곳에서도 셋팅은 필요합니다. 연결이 될 상대방의 네트워크 주소를 기입해야 합니다.

 그리고 connection 으로 대기상태에서 기다립니다. 그리고는 f5 키로 디버깅을 시작하면 잠시후 이것저것 dll 화일에 대해서 불만(?)을 토로할 수 (?) 있으나 무시하고 넘어갑니다. ( 두 컴의 소프트웨어 상태가 같은게 제일 편합니다. 같은 버전의 윈도우, 서비스 팩도 같이 깐 비주얼 스투디오.....)

 아마 리모트가 되고있는 자신의 프로그램을 상대방의 pc 에서 보실수가 있을겁니다.

 

- 리모트 디버깅에 필요한 화일 

리모트 디버깅에 필요한 화일은 디버깅할 컴퓨터에서는 VC++ 이 설치되어있기 때문에 추가로 필요한 화일이 없습니다. 타겟 컴퓨터에는 다음과 같은 화일들이 필요합니다.

    MSVCMON.EXE
    TLN0T.DLL
    DM.DLL
    MSDIS110.DLL

이상 4개의 화일은 \Program Files\Microsoft Visual Studio\Common\MSDev98\Bin

디렉토리에 있습니다.

    MSVCP6O.DLL
    MSVCRT.DLL

이상 2개의 화일은 \Windows\System 디렉토리에 있습니다.

이 화일들을 타겟컴퓨터의 \Windows\System 디렉토리로 복사합니다.

 

- 윈도우즈 NT에 관한 추가사항

윈도우즈 NT 에서는 위의 화일들 이외에 PSAPI.DLL이란 화일도 System 디렉토리로 복사 해야합니다. MSVCRT.DLL 화일을 System32 디렉토리로 옮깁니다.

 프로그램이 사용하는 DLL들도 타겟컴퓨터로 복사해야 됩니다. 릴리즈 버전 런타임 DLL은 운영체제와 같이 설치가 되었겠지만 디버그 버전 DLL들은 기본적으로는 설치가 안되었겠죠? 

기본적으로 MSVCRTD.DLL(Visual C++ Runtime DLL) 이 필요하고 iostream과 관련된 함수를 사용하셨다면 MSVCIRTD.DLL이 추가됩니다. 

MFC를 사용하신다면 다음 화일들도 추가됩니다.

    MFC42D.DLL (core)
    MFCO42D.DLL (OLE)
    MFCD42D.DLL (database)
    MFCN42D.DLL (network) 

그외에 프로그램이 추가적으로 사용하는 DLL이 있다면 그것도 복사해야겠지요. 만일 테스트할 프로그램에서 정확히 어떤 DLL들을 사용하는지 모르시겠다면 로컬로 디버깅 할때 VC++ IDE(통합개발환경)의 Output Window에 나오는 메시지들을 참고하세요.

예를 들어 "Loaded symbols for 'C:\WINDOWS\SYSTEM\MFCO42D.DLL" 이란 메시지가 있다면 프로그램이 MFCCO42D.DLL을 사용한다는 뜻이니까 타겟 컴퓨터에도 이 화일이 있어야 합니다.

  이 방법은 일반적으로 프로그램을 배포할 때도 유용한 팁이므로 기억해 두시면 유용할 겁니다

 

- 타겟 컴퓨터의 리모트 디버깅 환경설정하기

1. MSVCMON.EXE를 실행합니다.

"Visual C++ Debug Monitor"란 제목을 가진 다이알로그가 나타나는데, 리스트박스에 TCP/IP란 항목만 있을겁니다. VC++ 4.2버전에는 Serial도 있었는데 언제 없어졌는지 VC++ 6에선 이 항목이 없더군요.

2. Settings 버튼을 누르면 "Win32 Network Settings"란 제목을 가진 다이알로그가 나타납니다.

3. "Target machine name or address"란 필드에 디버깅을 할 타겟 컴퓨터의 IP어드레스나 컴퓨터 명을 적어주고 OK 버튼을 누릅니다.

4. Connect 버튼을 누르면 "Connecting.."이란 제목을 가지는 다이알로그가 나오는데 대기 상태로 들어간 것이지요. 취소하시려면 Disconnect 버튼을 누르면 되겠고요.

여기까지가 타겟 컴퓨터의 셋팅 전부 입니다.

 

- 디버깅을 할 컴퓨터의 리모트 디버깅 환경설정하기

1. IDE의 Build 메뉴에서 Debugger Remote Connection 항목을 선택하면 "Remote Connection" 다이알로그가 나타납니다. 

2. 여기 리스트 박스에는 항목이 두개가 있는데 "Network(TCP/IP)"항목을 선택하고 Settings 버튼을 누릅니다. "Target machine name or address" 필드에다 타겟 컴퓨터의 IP어드레스나 컴퓨터 명을 적어주고 OK버튼을 누릅니다. 

3. "Remote Connection" 다이알로그에서도 OK버튼을 눌러 다이알로그를 닫습니다.

4. IDE의 Project의 Settings 항목을 선택하면 "Project Settings" 다이알로그가 나타는데 Debug 탭을 눌러줍니다.

5. "Category" 콤보박스 필드는 General로 하시고 "Executable for Debug Session" 필드에는 실행화일의 경로를 적어주시는데 디버깅하는 컴퓨터 입장에서 본 실행화일의 경로를 의미합니다.

예를 들어 타겟컴퓨터의 이름이 "TARGET"이고 실행화일이 "Shaerd"란 공유폴더에 들어있다면 "\\TARGET\Shared\Test.exe"라고 적어주시고 타겟컴퓨터의 "Shared" 란 공유폴더가 "H"라는 네트워크 드라이브로 잡혀 있다면 "H:\Test.exe"라고 적어주시면 되죠.

 "Working Directory" 필드는 공란으로 비워두시고 "Remote Executable Path" 필드는 타겟컴퓨터 입장에서 본 실행화일의 경로를 적어줍니다. 예를 들면 "C:\Shared\Test.exe"와 같이 적어주시면 됩니다. 

6. 실행 화일이외에 추가로 디버깅할 DLL이 있다면 "Category" 콤보박스 필드에서 "Additional DLLs"를 선택한 후 디버깅하는 컴퓨터 입장에서 본 DLL 화일의 경로를 입력하시면 됩니다. 추가로 디버깅할 DLL이 없다면 이 과정은 생략하시구요. 

7. F5키를 눌러 디버깅을 시작합니다.

 

- 참고 사항

디버깅을 시작하면 "Find Local Module"이라는 다이알로그가 나타나고 프로그램이 사용하는 DLL 이름을 하나씩 대면서 이 DLL의 경로를 물어봅니다. "Try to locate other DLLs"란 체크박스의 표시를 풀어버리면 귀찮게 안할 겁니다. 그리고 두대의 시스템에 있는 DLL버전이나 언어형식이 일치하지 않으면 경고 메시지 박스가 나타나는데 무시하시거나 찜찜하시면 어느 한쪽으로 DLL을 복사해서 똑같이 만들어 주면 되겠죠.

 리모트 디버깅을 하다보면 실행속도가 많이 떨어지는 것을 느낄 수 있는데 네트워크로 연결하다 보니 어쩔수 없는 부분이죠. 하지만 루프를 많이 돈다거나 계산결과를 기다리는 경우에는 IDE를 Minimize 상태로 해두면 조금의 속도 향상을 얻을 수 있습니다.  

 

< 듀얼 모니터 디버깅 하기>

아래 방법을 쓰시기 전에(비디오카드 하나 더꼽기 전) 바이오스 셋업 항목에서 반드시 Init VGA sequence 인가? 하는 설정을 반드시 먼저 설정하고 카드를 꼽으세요. 어느 카드를 메인 카드로 쓰겠다는걸 뜻합니다. 그리고 비디오 드라이버는 둘다 최신으로 해주시구요.(안되다 되는걸 봐서요.) 비디오 카드끼리 궁합도 있으니...

괜히 이상한 카드로 인내심 테스트 하지 마시구요.

 보통 프로그램(윈도우 기반)은 여기 까지만 해도 디버깅이 잘 되는되요... (보통 듀얼 쓸것도 없지만...^^) DirectX같이 풀스크린 잡아먹는 녀석은 디버깅이 힘들죠...^^ 

 DirectDraw 에센셜에 보면 나와있는데, 우선,제어판의 DirectX실행하신다음 DirectDraw탭에서 Advanced에서 다중모니터 디버깅옵션을 체크해줍니다. 그 다음 중요한것은 개발환경은 Primary Device에 그리고 만드시는 애플리케이션을 Secondary Device에 띄우셔야 합니다... 

 Secondary에 띄우시는 방법은(아주 무식하게 하자면) (이것을 제대로 쓰시고자 하시면 FSWindow라는 예제에 비디오 카드를 고르게 해주는 루틴이 들어있으니 참고하세요) 

 DDRAW  예제에서 DDENUM이라는 실행하셔서 Secondary디바이스가 몇번째로 잡히는지 확인하신다음 DirectDrawEnumerateEX함수에서 내부적인 카운트를 설정하셔서 세번째 실행됐을때 그때의 GUID를 복사하신다음(반드시 복사를 하셔야합니다.그냥 어사인은 안됩니다. 나중에 해제되는것 같습니다) 그 GUID를 가지고 DirectDrawCreate에 첫번째 인자로 넣어주시면 됩니다.... (보통 널값을 넣습니다)

 

출처 : http://eunchul.com/database/board/cat.php?data=Win32_API&board_group=D40bc3894ad581&cur_page=3


'develop > windows' 카테고리의 다른 글

BOOST 컴파일 옵션  (0) 2010.02.03
메모리릭 발생 위치에 Breakpoint 설정하기  (0) 2010.02.03
MS Patch API  (0) 2010.02.03
File Drag & Drop  (0) 2010.02.03
HTTP 에러  (0) 2010.02.03

+ Recent posts