참고 : 본 내용은 MS Visual Studio 2008에 기반하며, 2010이나 2005 등에서도 별다를 바 없으리라 예상한다.

Remote Debugging 자체로만 보자면, 이를 위한 설정은 전혀 어려울 것이 없다. local에서 Attach to Process 하는 것과 다른 것이라곤 Remote Debugging Monitor를 디버그 대상 프로세스가 담긴 Remote Host에서 실행하는 단계 하나가 더 추가되었다고 할까?

하지만 항시 문제는 해당 과정까지의 환경 설정에서 발생하곤 하는데, Remote Debugging이 딱 그 꼴이다. Active Directory 등을 통한 동일 Domain 내의 Remote Host가 아닌 타 Domain의 Remote Host의 것을 하려다 보니 보안 관련 설정에서 당장에 문제로 다가온다. 난 꼬박 이틀 간 삽질했다. 어쨌건 아래 내용은 바로 이러한 상황에서의 Remote Debugging 방법이 되겠다.

1. Remote Host와 개발 Host 모두에 동일한 id/pwd의 계정을 생성한다.
- Remote Host의 계정은 관리자 계정으로 설정한다.
- 본 계정을 통해 Remote Host에서 #2에서 설명할 공유 폴더로 접근 가능하게 될 것이다.

2. 개발 host의 'VSDir\Common7\IDE' 폴더에 Remote Host에서 접근 가능하도록 공유 설정해 놓는다(VSDir은 Visual Studio가 설치된 폴더를 뜻한다).
- 이는 Remote Debugging Monitor(msvsmon.exe)와 Remote Debugging Configuration Wizard(rdbgwiz.exe)를 실행하기 위해서다. 전자는 위 폴더를 기준으로 Remote Debugger\x86(또는 x64)에 있으며, 후자는 위 폴더에 있다. 후자는 Windows Service나 ASP.NET App을 Debugging할 때 사용한다.
- Remote Debugging 관련 파일을 Remote Host에 복사해서 사용할 수도 있지만, Remote Host에서 개발 host로 접근 가능함을 확인하는 차원에서도 이와 같이 하는게 유리하다. MSDN에서 이렇게 가이드하고 있다.

3. Remote Host에서 Remote Debugging Monitor를 #1에서 생성한 계정으로 실행한다.
- 'Run As 명령'을 사용하는데, 이는 msvsmon.exe에 shift 키를 누른 상태에서 context menu를 열면 메뉴 항목으로 나타난다.
- debugging 대상 process의 버전에 따라 x86 버전 또는 x64 버전으로 달리 실행해야 한다. 이게 안맞음 0x80040900 번호의 오류 메시지와 함께 Attach 중간에 실패한다.
- 실행 직후 본 프로세스에 대해 Windows Firewall의 규칙 설정을 이루는 대화상자가 자동으로 나타나기에, 따로 Windows Firewall을 끌 필요는 없다. 이 때 개발 host와 remote host가 동일 network에 있는지 여부를 잘 판단하여 옵션을 선택해야 한다.

4. 개발 host에서 #1에서 생성한 remote host 계정으로 Windows Credential을 등록한다.
- Windows 7을 기준으로 Control Panel -> User Accounts -> Credential Manager -> Add a Windows credential의 절차를 통해 등록 대화상자를 열고,
- Internet network address에는 remote host의 이름(예: RemoteServer), User Name에는 #1에서 생성한 id(왠간하면 host 이름도 함께 넣도록. ex. RemoteServer\UserName), 그리고 password를 마지막 란에 넣어 생성한다.
- Windows XP의 경우에는 Control Panel -> User Accounts -> 현재 로그인된 Account 클릭 -> Manage my network passwords까지 가면 Stored User Names and Passwords 대화상자가 나타난다. 여기서 Add를 눌르면, 나타나는 대화상자에서 위와 동일한 절차를 거칠 수 있다.
- VS가 Remote Debugging Monitor에 접근할 때 사용하는 것으로 이해했는데, 정작 연결 로그를 보면 꼭 그렇지만도 않은 듯 하다. 이유야 어쨌건 본 과정은 필수다.


여기까지 하면 주요 기본 환경 설정이 마무리된 것이다. 이제 Visual Studio를 통해 remote host로 붙어본다.


5. Visual Studio의 Debug 메뉴에서 'Attach to Process...' 항목을 클릭하여 해당 대화상자를 열고, Qualifier 항목에 remote host 이름과 실행 계정을 입력한 후 Enter 키를 누른다.
- 입력 포맷은 '계정@remote host 이름'이며, 본 값은 Remote Debugging Monitor를 실행했을 때 처음 나타나는 log message에 담긴 값과 동일해야 한다. 아래의 메시지는 본 설명의 예인데, 이 경우 debugger@RemoteServer를 Qualifier 항목에 입력해야 한다.
4/30/2010 10:08:22 PM Msvsmon started a new server named 'debugger@RemoteServer'. Waiting for new connections.
위 과정까지 정상적으로 마치고 나면 Attach to Process 대화상자 하단에는 Remote Host에서 실행되고 있는 Process 목록이 나타날 것이다. 이제 Debugging할 Process를 찾아 선택하여 Attach 버튼을 클릭하면 끝이다.

6. [옵션] ASP.NET App이나 Windows Service에 대한 Remote Debugging
- 이를 위해서는 #3을 실행하기 전에  Remote Debugging Configuration Wizard(rdbgwiz.exe)를 Remote Host에서 실행하여 해당 위저드에서 유도하는 단계를 정상적으로 거쳐야 한다(본 파일의 위치는 #2에서 설명했다).
- 위저드에서는 설명이 잘 되어 있어 값 입력에 별로 눈에 띄는 바가 없지만, Finish 지점에서 Fail이 날 경우도 있다. 이 때 역시 당황하지 말고 해당 위저드가 가이드하는 대로 따라하면 쉽게 해결된다(관리 도구 -> Local Security Policy 실행 -> 좌측 트리에서 Local Policies의 User Rights Assignment 선택 -> Log on as a service 항목 열기 및 #1에서 등록한 계정 입력 정도?)


p.s. Remote Debugging Monitor로의 연결 시 가끔가다가 Firewall이 막고 있다는 오류 메시지와 함께 Attaching에 실패하는 경우가 있다. 이 때는 별 수 없다. Remote Host의 Windows Firewall을 꺼버리도록(디버깅 할 동안만 그리하는게 물론 좋겠다. ㅋ)

Posted by 어쨌건간에