[기술컬럼] Kernel Mode Debugging With Visual Studio 2013

Setting up Environment To Kernel Mode Debugging With Visual Studio

1. 소개

이번 칼럼에서는 커널모드 윈도우즈 드라이버 개발을 위한 커널 디버깅 환경 구축 방법에 대한 소개입니다. 이 글의 목적은 우리가 익히 알고 있고 익숙한 통합 개발환경(IDE)인 ‘Microsoft Visual Studio 2013’ WIndows Dirver Kit 8.1 이용한 커널 라이브 디버깅 환경을 구축 해 보는 것입니다. 최종적으로 이 글의 설명대로 환경 구축이 완료되면 아래의 링크의 동영상과 같은 개발 환경을 이용할 수 있게 됩니다.

http://msdn.microsoft.com/en-us/library/windows/hardware/ff554672(v=vs.85).aspx

칼럼을 쉽게 이해하려면 1항목을 읽으시고, 자신이 원하는 디버깅 방법을 선택해서(2~5 항목 중 하나) 읽으신 다음 마지막으로 자동화 디버깅 환경 구축(6번 항목)에 대해 읽으시는 것을 추천합니다.


1.1. 디버그 그리고 디버거

이번 칼럼에서는 디버그(Debug)에 관련된 내용을 소개 하고자 합니다. Wikipedia에 정의된 디버그의 정의는 아래와 같습니다.
디버그(공학: debug), 디버깅 (공학: debugging) 혹은 수정은 컴퓨터 프로그램의 정확성이나 논리적인 오류(버그)를 찾아내는 테스트 과정을 뜻한다. 디버깅(debugging), 수정이라고도 한다.

매우x100 뛰어난 천재 개발자가 아닌 이상 프로그램을 처음부터 논리적으로 완벽하게 작성하기란 매우 힘든 일이라 생각됩니다. 논리/시간적 요인 뿐 아니라 여러가지 외적인 요인으로 인해서 버그가 발생하는데 개발자가 이 모든 상황을 예측하기란 매우 힘든 일입니다.

예상하기 힘든 버그를 해결 하기 위해 많은 개발자들은 디버그 작업을 하는데, 이 디버그는 항상 같이 다니는 친한 친구가 있습니다. 바로 디버거(Debuger)입니다. 마찬가지로Wikipidia에 정의된 내용을 인용해봤습니다.
디버거(공학: debugger)는 디버그를 돕는 도구이다. 디버거는 주로 원하는 코드에 중단점을 지정하여 프로그램 실행을 정지하고, 메모리에 저장된 값을 살펴보며, 실행을 재개하거나, 코드를 단계적으로 실행하는 등의 동작을 한다. 고급 디버거들은 메모리 충돌 감지, 메모리 누수 감지, 다중 스레드 관리 등의 기능도 지원한다.


위 정의대로 프로그래머가 가질 수 있는 최고의 무기 중 하나로 느껴지지 않나요?
무릇 무협의 고수가 무기를 잘 활용해 무림을 재패하는 것과 같이 개발자가 디버거라는 무기를 잘 활용 하려고 노력하는 것은 고수가 되기 위한 하나의 길이라 생각합니다.


1.2. 커널 디버깅 조건

커널모드에서 동작하는 프로그램을 라이브 디버깅 할 경우, 통상적인 경우에는 2대의 머신을 활용하게 됩니다. 우리가 커널 모드 프로그램을 라이브 디버깅하는 상황을 상상하십시오. 그리고 의심스러운 코드에 직접 설정한 중단점에 의해서 Break가 걸린 상황을 상상해
보십시오. 그렇다면, 커널의 동작이 멈추면서 System이 멈춰버리는 상황을 떠올렸을 것이라 믿습니다. 앞선 상황이 잘 이해가 됬다면 왜 2대의 머신이 필요한가에 대해서도  이해할 수 있을 것 입니다. 저는 이 2대의 머신을 구별하고 싶습니다.
커널모드 프로그램이 동작하고 있는 머신을 디버기(Debuggee)라고 하겠습니다. 그리고, 디버거를 이용하며 디버기를 관찰하고 있는 머신을 디버거(Debugger)라고 하겠습니다.
굳이 이렇게 구별하는 이유는 차 후에 등장할 많은 설명들을 쉽게 하기 위해서 입니다.
때로는 좀 더 쉬운 이해를 위해  디버기를 타겟(Target), 디버거를 호스트(Host)라고 하겠습니다.


1.3. Host 기본 환경 구축

우선, Microsoft Visual Studio 2013(VS2013)을 설치해야 합니다. 만약 독자가 학생일 경우 정식 버전을 Microsoft Dream Spark에서 무료로 제공 받을 수 있습니다. Dream Spark 혜택에 관한 구체적인 내용은 이번 주제와는 거리가 멀기 때문에 생략하도록 하겠습니다.

그 다음 준비해야 될 것은 WDK 8.1(Windows Driver Kit 8.1)을 설치해야 합니다. WDK 8.1 Update는 아래의 링크에서 제공하고 있습니다. 해당 업데이트를 하면 기존에 설치된 VS2013에 WDK 기능이 추가됩니다. VS2013을 이용한 드라이버 개발엔 필수적입니다.

해당 링크에서 Visual Studio 2013 및 WDK8.1 Update를 제공 받을 수 있습니다.
http://msdn.microsoft.com/en-us/windows/hardware/hh852365.aspx

여기서 한 가지 주의해야 될 점을 위 링크에서도 명시하고 있는데 그 내용은 아래와 같습니다.
Important: Before installing WDK 8.1 Update, you need to install Visual Studio 2013.  …..

즉 WDK 8.1 설치하기 전에 반드시 먼저 VS2013 설치해야 된다는 내용입니다. 해당 내용을 잘 파악해서 여러분들이 시간 낭비 하는 일이 없었으면 좋겠습니다.
위의 과정을 정확이 따라 설치하면 VS2013에 확장된 Driver 개발 메뉴와 기능들을 확인할 수 있는데 가장 큰 특징 중 하나는 상단 메뉴바에 ‘Driver’ 메뉴가 있는 것이 특징입니다.


그리고, Windows Driver Project를 생성할 수 있어야 합니다. 상단 메뉴를 이용하여 새로운 Project를 생성할 수 있습니다. File > New > Project.. 를 선택하고 생성 가능한 프로젝트 종류에 Windows Dirver가 존재하는지 확인 해야 합니다.

위와 같은 환경이 구성되어 있다면, 마지막으로 VS2013에서 빌드 가능한 윈도우즈 드라이버 프로젝트를 확보해야 합니다. 빌드 가능한 드라이버 코드가 없다면 아래의 절차를 따라 Sample Project를 생성합니다. 이 과정은 차후에 커널 디버깅 환경이 잘 구성되었는지 확인하기 위해서 필요한 작업입니다.

새로운 Project를 생성할 때 온라인에서 Sample Project를 가져와서 VS2013에서 빌드 가능한 환경을 그대로 생성할 수 있습니다. 자신이 원하는 드라이버 샘플을 하나 가져와서 새로운 샘플 Project를 생성하고 빌드가 가능한지 테스트 해봅니다.


1.3. Target 기본 환경 구축

  1.3.1. Target 머신 보안 부팅 끄기

아래의 링크를 참고하면 어떻게 보안 부팅모드를 사용안함 설정할 수 있는지 자세한 내용을 참고할 수 있습니다. 보통 컴퓨터 최초 부팅시 BIOS 설정에서 보안 부팅옵션 관련 탭에서 ON/OFF할 수 있습니다.
  1.3.2. Target 머신에 ‘WDK Test Target Setup’  설치하기
‘WDK Test Target Setup’의 경로는 Host 머신에 WDK 8.1을 설치했다면 Host 머신에서 찾을 수 있습니다. 기본적으로 ‘WDK Test Target Setup’의 경로는 아래 박스를 참고하십시오.
Target 머신이 x64 플렛폼일 경우 Host 머신의 아래 경로에서 설치 파일을 찾습니다.
C:\Program Files (x86)\Windows Kits\8.1\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi 또는
C:\Program Files\Windows Kits\8.1\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi
Target 머신이 x86 플렛폼일 경우 Host 머신의 아래 경로에서 설치 파일을 찾습니다.
C:\Program Files (x86)\Windows Kits\8.1\Remote\x86\WDK Test Target Setup x86-x86_en-us.msi 또는
C:\Program Files (x86)\Windows Kits\8.1\Remote\x86\WDK Test Target Setup x86-x86_en-us.msi
   
아래와 같이 Target 머신에 설치가 잘 되어있는지 확인할 수 있습니다.   



  1.3.3. Target 머신이 Windows N 또는 KN 버전일 경우

Windows Media Feature Pack을 설치해야 합니다. 아래의 링크를 통해 설치 파일을 다운로드하고 Target PC에 설치합니다.

Media Feature Pack for N and KN versions of Windows 8.1 일 경우http://www.microsoft.com/ko-kr/download/details.aspx?id=40744
Media Feature Pack for N and KN versions of Windows 8 일 경우http://go.microsoft.com/fwlink/p?linkid=329738
Media Feature Pack for N and KN versions of Windows 7 일 경우http://www.microsoft.com/ko-kr/download/details.aspx?id=16546


  1.3.4. Target 머신이 Windows Server 운영체제인 경우

6.2.2. 항목에서 ‘WDK Test Target Setup’을 설치하면 ‘C:\DriverTest’ 폴더가 생성되는데, 해당 폴더의 보안 속성을 바꿔줘야 합니다. ‘Authenticated Users’ 그룹에 모든 권한을 부여해야 합니다.



  1.3.5. Target 머신 보안 설정 변경

제어판 -> 관리도구 -> 로컬 보안 정책을 실행합니다. 우측 메뉴들 중 로컬 정책-> 사용자 권한 할당을 누르면 아래의 화면이 나타나는데 빨간 박스의 ‘네트워크에서 이 컴퓨터 엑세스 거부’에 Guest가 설정되어 있다면 제거합니다.
‘그리고 네트워크에 이 컴퓨터 엑세스’에서 ‘Guest’또는  ‘Everyone’을 추가합니다.


  1.4. UsbView Tool 준비

UsbView 툴은 WDK 8.1 업데이트를 설치하면 같이 포함되어 있는 툴 입니다.
해당 툴을 이용하면 현재 내 컴퓨터에 연결된 USB 및 연관 장치들을 계층적(Tree) 형태로 보여줍니다. USB Debugging 환경을 구축할때 해당 툴을 이용하면 매우 유리하므로 따로 기억하기 쉬운 곳에 저장해 놓는 것을 추천합니다. USB Cable을 이용하여 디버그 환경을 구축하지 않으실 분은 설치하지 않으셔도 됩니다.
C:\Program Files (x86)\Windows Kits\8.1\Tools\x86\usbview.exe // x64 운영체제 기준
C:\Program Files\Windows Kits\8.1\Tools\x86\usbview.exe // x86 운영체제 기준

2. Target – Virtual Machine(VM)


  2.1. 소개

가상 머신을 디버기로 활용하여 어떻게 커널 라이브 디버깅 환경을 구축할 수 있는지 소개하겠습니다. 가상 머신을 활용하는 방법은 여러가지로 장점이 많습니다. 당장 생각나는 장점은 프리웨어 가상머신 소프트웨어를 이용할 경우 환경 설정을 위해서 비용이 일절 들지않습니다. 그리고 별도의 Test PC를 가지고 있지 않는 상황에서도 환경 구축이 가능 하기 때문에 많은 취미 개발자들에게 환영 받는 방법이라고 생각합니다. 또한 디버기가 스스로 작성한 실험적인 드라이버로 인해 복구 불가능한 상태에 빠져도 쉽게 복구할 수 있는 장점이 있습니다.


  2.2. 준비물  요구사항

     2.2.1. Virtual Machine(VM) 에뮬레이터 설치  VM OS 설치

VM 에뮬레이터의 대표적인 소프트웨어로 VMware, Virtual Box가 있습니다. Host 머신에서 Target 머신이 가상화 되어 동작할 수 있도록 Host머신에 VM 에뮬레이터를 설치하고 자신이 테스트하고자 하는 운영체제를 설치합니다. 필자는 무료로 제공되는 소프트웨어인 ‘VMware Player’를 사용했고, VM에 운영체제는 Windows7-x86을 설치했습니다.
VM에 운영체제까지 설치되면 해당 VM도 하나의 Target 머신의 역할이 가능합니다.


  2.3. Target PC 설정

     2.3.1. VM Virtual Serial Port 생성

VM 에뮬레이터를 실행하고 우리가 디버그 하고자하는 Target 머신을 설정합니다.

(아래의 그림 참고)

새로운 가상 Serial Port를 생성하기 위해서 Add… 버튼을 클릭합니다.

Serial Port를 선택하고 Next 버튼을 클릭합니다.

  다음 화면이 나타나면 ‘Output to named pipe’를 선택하고 ‘Next’ 버튼을 클릭합니다.

다음과 같은 화면이 나타나면, 아래와 같이 입력합니다. 빨간테두리의’kdbg’는 자신이 기억하기 쉬운 이름으로 대체하셔도 됩니다. ‘\\.\pipe\???’ 형태의 포멧은 그대로 지키는 것을 권장합니다. 설정을 완료하시면 아래의 ‘Finish’ 버튼을 클릭합니다.



새로운 가상의 Serial Port가 생성되면 아래와 같이 VM Setting 화면에서 우리가 추가한 Serial Port를 확인할 수  있습니다. 마지막으로 해당 Serial Port를 이용하여 데이터 통신을 하는 방식으로 Polling 방식을 이용하기 위해 ‘Yield CPU on poll’ 옵션을 반드시 체크합니다.


  2.3.2. Target 머신 운영체제의 부팅 옵션 변경

우선 ,VM에서 2.3.1. 에서 추가한 ‘Serial Port 2’가 연걸된 상태인지 확인하고, 연결되지 않다면 연결합니다.

Target이 Debuggee의 역할을할 수 있도록 설정하기 위해서 명령 프롬프트를 관리자 권한으로 실행 시킵니다.


명령프롬프트에 아래의 명령을 입력하여 부팅 옵션을 변경한 다음 재부팅 합니다.
bcdedit /debug on
bcdedit /dbgsettings serial debugport:2 baudrate:115200
shutdown -r -t 0


  2.4. Host PC 설정

Visual Studio 2013을 실행시키고 VM을 디버기로 활용하기 위해 등록 및 환경 설정이 필요합니다. Visual Studio 2013  상단 메뉴바에 ‘Driver > Test > Configure Computers…’ 메뉴를 클릭합니다. (해당 메뉴를 이용하려면 Visual Studio 2013에 WDK 8.1 업데이트가 되어 있어야 합니다.)

아래와 같은 화면이 나타나면 ‘Add New Computer’ 버튼을 클릭합니다.



아래의 그림과 같은 화면이 나타나면 Computer Name은 Target 컴퓨터의 이름을 입력해야합니다. 
해당 이름을 확인하기 위해서 Target 머신에서 장치관리자를 실행시킨 후 아래의 그림과 같이 컴퓨터의 이름을 확인해야 합니다. (WIN-NUOT6SGIDR6)

 이름이 확인되면 아래와 같이 설정하고 ‘Next>’ 버튼을 클릭합니다.

다음과 같은 화면이 나타나면 아래와 같이 입력하고 ‘Next>’ 버튼을 클릭합니다.
   여기서 Pipe Name에 해당하는 값으로는 우리가 2.3. 항목에서 Target 머신 설정을 했을 때의 값들과 동일하게 기입해야 합니다.  

설정을 완료하면 ‘Next>’ 버튼을 클릭합니다.


아래와 같은 화면이 나타나는데, Target 머신의 사용자 계정에 로그인하게 되면 
Target 머신에 자동으로 환경 설정을 시작하게 됩니다.

 아래 그림과 같은 화면을 통해서 Target 머신의 환경 설정 진행 상황에 대해 알 수 있습니다. Target 머신의 환경 설정이 자동으로 진행되면서 재부팅 하는 모습도 확인할 수 있습니다.

Target 머신의 설정이 정상적으로 완료되면 아래와 그림과 같은 상태를 확인할 수 있습니다. 
‘Next’ 버튼을 클릭합니다.

마지막으로 아래 그림과 같이 설정 결과에 대해서 간략하게 표시해 주는 화면을 확인할 수 있으며, ‘Finish’ 버튼을 클릭하여 완료합니다.




3. USB 2.0 Debug Cable 이용하기
  3.1. 소개

USB 2.0 Debug Cable은 소개하는 방법 들 중 가장 비싼 비용으로 환경 구축이 가능합니다.
또한 통신 속도도 다른 방법에 비해서 크게 뛰어나지 않습니다. 하지만 usb 3.0을 지원하지 않는 오래된 머신에서 활용 가능한 장점이 있습니다.

  3.2. 준비물  요구사항

     3.2.1. Target 머신(Debuggee)

Windows Vista 이상의 버전에서만 환경 구축이 가능한 제약 사항이 있습니다.
USB 2.0 호스트 컨트롤러가 장착되어 있어야 하며 이 호스트 컨트롤러는 debugging 기능을 지원할  있어야 합니다. 아래의 그림은 윈도우즈 장치관리자에서 USB Enhanced 호스트 컨트롤러(USB 2.0 호스트 컨트롤러)가 장착되어 있다는 것을 나타내고 있습니다.  


     3.2.2.  Host 머신(Debugger)

Windows 2000 이상의 버전에서만 환경 구축이 가능한 제약 사항이 있습니다.
마찬가지로 Host 머신에서도 USB 2.0 호스트 컨트롤러가 장착되어 있어야 합니다.

     3.2.3. USB 2.0 debug cable

디버그 가능한 USB 2.0 전용 Cable입니다. 일반적인 USB 2.0 케이블로는 환경 구축이 불가능하고 별도의 물리적인 디버그 기능을 가지고 있는 장치를 포함한 디버그 전용 케이블이 필요합니다. 해당 장치의 모습은 아래와 같습니다.




위 그림에서 보이는 2개의 케이블을 파란색 장치에 연결한 뒤에 최종적으로 Target과 Host를 연결하는 형식입니다. 해당 제품명은 보통 ‘USB 2.0 Debug Cable’로 불립니다.
해당 제품은 아래의 링크에서 구매할 수 있습니다. 가격이 만만치 않다고 느껴진다면 다른 디버깅 방법을 추천합니다.


  3.3. Target PC 설정
      3.3.1. 디버그 가능한 포트 찾기

디버그 가능한 포트를 확인하기 이전 Target 머신의 USB 2.0 호스트 컨트롤러가 디버깅 모드를 지원하는지 여부를 알아내야 합니다. UsbView 툴을 사용하여 아래 그림과 같이 확인할 수 있습니다. 아래 그림의 의미는 해당 호스트 컨트롤러에서의 디버그 포트는 2번 포트임을 나타냅니다.
 USB View를 활용하면 아래의 그림과 같이 USB 호스트 컨트롤러 – Root Hob – Port의 계층을 확인할 수 있는데, 위 에서 확인하기로 2번 포트에 대한 정보를 직접 확인해도 디버그가 가능한 포트임을 확인할 수 있습니다. (Window 버전마다 보여지는 정보가 달라 질 수가 있습니다.)


  UsbView 툴은 장치가 부착되면 아래와 같이 표시가 바뀌게 됩니다. 이러한 사실을 이용하면 Target 머신의 수많은 USB 포트 중 어떤 포트가 디버그 가능한 포트인지 쉽게 확인할 수 있습니다.

마지막으로 기억 해 두어야 할 것이 한 가지 있습니다. 현재 내가 사용할 디버그 포트에 해당하는 호스트 컨트롤러의 위치를 기억해야 합니다. 확인 하기 위해서 USB 2.0 Debug Cable이 연결되어있는 포트와 그 포트에 해당하는 호스트 컨트롤러를  USB View로확인 합니다.


호스트 컨트롤러의 이름을 기억하고 이에 해당하는 호스트 컨트롤러의 현재 상태를 확인하기 위해 윈도우즈 장치관리자를 이용합니다.

 해당 호스트 컨트롤러를 우클릭 후 속성 메뉴을 선택합니다.

  위와 같은 화면이 나타나는데 빨간 테두리의 내용을 잘 기억해 둬야 합니다. (0, 29, 0)


     3.3.2. 부팅 옵션 설정

Target 머신이 디버그 가능한 상태로 부팅되기 위해서 명령 프롬프트를 관리자 권한으로 실행하고 아래 박스에 있는 명령을 입력해야 합니다.



<Windows 7or later>
bcdedit /debug on
bcdedit /dbgsettings usb targetname:<any-name>
bcdedit /set {dbgsettings} busparams a.b.c (a,b and c is decimal)
<Windows Vista>
bcdedit /debug on
bcdedit /dbgsettings usb targetname: <any-name>
bcdedit /set {current} loadoptions busparams=x.y.z (x,y and z is hexadecimal)

위 박스에 있는 명령을 입력할 때 Windows Vista와 Windows7 이상의 버전에서 서로 차이점이 있습니다. targetname:<any-name> 의 <any-name>은 기억하기 쉬운 임의의 문자열을 입력합니다. busparams에 해당하는 값으로는 3개의 정수값을 입력해야 하는데, 3.3.1 에서 확인한 디버그 포트에 해당하는 호스트 컨트롤러의 위치를 장치관리자를 통해 파악했었습니다. 이 값을 형식에 맞게 기입하면 됩니다. 현재 예제에서는 Windows7을    기준으로 입력하면 아래 박스와 같습니다.

bcdedit /debug on
bcdedit /dbgsettings usb targetname:usbdebug
bcdedit /set {dbgsettings} busparams 0.29.0

   Windows Vista일 경우 현재 예제에서는 아래와 같이 입력합니다.
bcdedit /debug on
bcdedit /dbgsettings usb targetname:usbdebug
bcdedit /set {current} loadoptions busparams=0.1d.0

  위와 같이 입력한 후에 재부팅 하면 Target 머신의 환경 설정은 완료된 상태입니다.



  3.4. Host PC 설정

     3.4.1. Host Target 방지

Host 머신이 USB Debugging의 Target이 되면 안되기 때문에 명령 프롬프트를 관리자 권한으로 실행하고 아래 박스의 명령을 입력한 후 재부팅 합니다.
bcdedit /debug off

      3.4.2. USB 2.0 Debug Cable 드라이버 설치

Host 머신에서는 USB 2.0 Debug Cable 드라이버 설치가 필요합니다. 장치가 Host 머신에 장착되면 기본적으로 드라이버 설치에 실패하게 됩니다. 그래서 수동으로 드라이버를 설치해야 합니다. 우리는 이전에 항목 1.3. 에서 기본적인 Host 환경 구축을 위해서 Windows Driver Kit 8.1 을 설치했었는데 설치를 완료하면 아래의 경로에서 USB 2.0 Debug Cable 드라이버 설치를 위한 inf파일을 찾을 수 있습니다. 드라이버 설치를 위해 아래의 박스를 참고하십시오.
64비트 운영체제를 사용하신다면 아래의 경로를..
C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\usb\usb2dbg.inf
32비트 운영체제를 사용하신다면 아래의 경로를..
C:\Program Files\Windows Kits\8.1\Debuggers\x86\usb\usb2dbg.inf


     3.4.3. Visual Studio 2013 환경 설정

Visual Studio 2013에서 그림과 같이 DRIVER > Test > Configure Computers.. 클릭합니다.

아래의 그림과 같은 화면이 나타나면 ‘Add New Computer’ 버튼을 클릭합니다.

아래의 그림과 같은 화면이 나타나면 Target 머신의 컴퓨터 이름을 적습니다. 컴퓨터 이름을 확인하는 방법은 장치관리자에서 확인할 수 있습니다.

현재 Target 머신의 이름은 ‘jh_win8_32-pc’ 입니다. 이제 컴퓨터 이름을 알아 냈으니 아래와 같이 설정하고 ‘Next>’ 버튼을 클릭합니다. 그러면 아래와 같은 화면이 나타나는데, 항목 3.3.1 에서 Target 머신의 USB 호스트 컨트롤러의 정보 값을 알아 냈었고 그 값을 항목 3.3.2 에서 부팅 설정 변경을 하면서 이용했었습니다.  
 Target 머신에서 설정한 빨간 테두리의 값을 기준으로하여 아래와 같이 입력하고 ‘Next>’ 버튼을 클릭합니다.

정상적으로 설정되어 진행되었다면 아래와 같이 Target 머신에 접근합니다.
Target 머신의 사용자 계정 이름과 비밀번호를 입력하고 ‘확인’ 버튼을 누릅니다.

로그인에 성공했다면 Target 머신이 재부팅 되고, Target 머신이 디버깅 환경을 구축하기 위해 필요한 프로그램을 설치하기 시작합니다. 모든 설정이 완료되면 아래와 같은 그림과 같은 상태가 됩니다. ‘Next>’ 버튼을 클릭합니다.

최종적으로 Visual Studio 2013에서 원격 디버깅을 위한 Target 머신의 등록 상태를 표시해줍니다. ‘Finish’ 버튼을 누르고 완료합니다.


4. USB 3.0 Debug Cable 이용하기

  4.1. 소개

USB 3.0 Debug Cable은 USB 2.0 Debug Cable 환경 설정 방법과 매우 유사합니다.
USB 2.0 Debug Cable을 활용하는 방법보다 상대적으로 전송 속도가 빠른 장점이 있습니다.
그리고 USB 2.0 Debug Cable보다 값이 저렴한 것이 특징입니다.

  4.2. 준비물  요구사항

     4.2.1. Target 머신(Debuggee)

USB 3.0 호스트 컨트롤러가 장착되어 있어야 하며 이 debugging 기능을 지원할  있어야 합니다. 아래의 그림은 윈도우즈 장치관리자에서 USB 3.0 Host Controller(XHCI)가 장착되어 있음 나타내고 있습니다.

     4.2.2.  Host 머신(Debugger)

마찬가지로 Host 머신에서도 USB 3.0 호스트 컨트롤러가 장착되어 있어야 합니다.

     4.2.3. USB 3.0 Debug Cable
일반적인 USB 3.0 A to A Cable은 디버깅 용도로 사용이 불가능합니다. 
따라서 디버깅 용도로 제작된 USB 3.0 A to A Debug Cable을 사용해야 하는데, 일반적인 USB 3.0 스펙을 준수하여 제작된 케이블과는 다릅니다. 전원을 공급받기 위한 1(VBUS) 라인과 USB 2.0 하위 호환을 위해서 가지고 있는 및 2번(Data-), 3번(Data+) 데이터 라인이 제외되어 있는 것이 특징입니다. 해당 제품은 아래의 링크에서 구매 가능합니다.

  4.3. Target PC 설정

USB 3.0 Cable을 이용한 디버그 환경 설정도 USB 2.0과 매우 비슷합니다. 우선 USB 2.0에서 호스트 컨트롤러가 디버깅 모드를 지원하는지 UsbView 툴을 이용해서 Target 머신의 USB 3.0 호스트 컨트롤러가 USB Debugging Mode를 지원하는지 확인해야 합니다.

그 다음으로 장치관리자 또는 UsbView 툴을 이용하여 USB 3.0 호스트 컨트롤러의 정보를 조사합니다. (0, 20, 0)


마지막으로 OS 부팅 설정을 완료하고 재부팅할 수 있도록 합니다. 이전에 설명했던 USB 2.0 디버깅 설정과 동일한 방식으로서 아래의 명령을 이용합니다. 좀 더 자세한 설명은 항목 3.3.2. 를 참고하시기 바랍니다.

bcdedit /debug on
bcdedit /dbgsettings usb targetname:usbdebug
bcdedit /set {dbgsettings} busparams 0.20.0


  4.4. Host PC 설정

항목 3.4 의 USB 2.0 디버깅의 Host PC 설정 부분과 동일한 방식이므로 해당 항목을 참고 하시기 바랍니다.   

5. Network Cable 이용하기

  5.1. 소개

네트워크 케이블을 이용해서 같은 로컬 네트워크 영역에 포함된 Host와 Target을 연결하는 방식입니다. 일반적으로 우리가 인터넷 사용을 위해 사용하는 LAN Cable을 이용하기 때문에 USB Debug Calbe을 이용하는 것 대비 가격이 매우 저렴하고, 어디서나 쉽게 구할 수 있다는 장점이 있습니다. 하지만, Target PC에 설치된 운영체제가 윈도우즈 8 이상 버전에서만 환경 설정이 가능하기 때문에 이전 버전의 윈도우즈를 Target으로 하지 못하는 단점이 있습니다. 또한, 환경 설정시 방화벽과 관련된 문제로 인해서 환경 설정이  되지 않는 경우가 있습니다이런 경우 Target 머신과 Host 머신의 방화벽 설정을 바꿔줘야 합니다다시 한번 방화벽 문제에 대해서 인지하고 있길 바랍니다.


  5.2. 준비물  요구사항

     5.2.1. Target 머신(Debuggee)

Windows 8 이상의 운영체제가 설치되어 있어야 합니다. 또한 네트워크 어뎁터가 디버깅 모드를 지원할 수 있어야 합니다. 우선 Target 머신에서 사용중인 네트워크 어뎁터의    VID(vendor id), PID(product id)를 확인하고 해당 VID와 PID가 아래의 링크에서 명시된 디버깅 지원 장치 리스트에 포함 되어있는지 확인 합니다.

위 사진과 같이 장치관리자에서 네트워크 어뎁터에 해당하는 VID와 PID를 확인합니다.
그리고, 아래의 링크에서 위에서 확인한 VID/PID가 지원 리스트에 포함되는지 확인합니다.

     5.2.2. Host 머신(Debugger)

Windows XP 이상의 운영체제에서 동작할 수 있으며, 네트워크 어뎁터가 연결되어 있어야 합니다.


  5.3. Target PC 설정

부팅 모드 변경을 디버그 모드로 설정 하기 위해 Target 머신에서 명령프롬프트를 관리자 권한으로 실행합니다. 그리고 아래의 명령을 입력하고 시스템을 재부팅 합니다.
hostip의 값은 Host 머신의 네트워크 어뎁터에 해당하는 ipv4주소를 입력합니다.
(Host 머신에서 명령프롬프트에 ipconfig 명령 입력해서 확인합니다.)
port의 값은 49152~65535 범위 내의 값이 되어야하며, 로컬 내트워크 내에 다른 머신에서 사용하지 않는 포트 값으로 선정해야 합니다. 그리고 Target 머신에 설치된 네트워크 어뎁터가 2개 이상일 경우에 busparams 값을 셋팅해줘야 합니다. busparams 값을 확인하려면 장치관리자에서 해당 네트워크 어뎁터에 대한 정보를 확인합니다.


bcdedit /debug on
bcdedit /dbgsettings net hostip:a,b,c,d port:49152~65535

//추가적으로 target 머신에 설치된 네트워크 어뎁터가 2개 이상일 경우 아래명령 입력
bcdedit /set {dbgsettings} busparams x,y,z


위 그림은 명령을 입력한 화면입니다. 명령을 입력하면 자동으로 키 값이 생성됩니다.
해당 키 값은 나중에 Host에서 Target으로 접근하는데 필요한 값이라 나중에 활용되므로 잘 기록해둬야 합니다. 설정을 완료했으면 시스템을 재부팅 합니다.


  5.4. Host PC 설정

Visual Studio 2013에 Target 머신을 등록하기 위해서 Visual Studio 2013 상단 메뉴바의 Driver > Test > Configure Computers.. 를 클릭합니다.

아래와 같은 창이 나타나면 ‘Add New Computer’ 버튼을 클릭합니다.


‘computer name’의 값으로 Target 머신의 이름을 입력해야  합니다. Target 머신의 이름을 확인하는 방법은 3.4.3. 항목에 설명되어있기 때문에 생략하겠습니다.  아래와 같이 설정 후 ‘Next’ 버튼을 클릭합니다.

다음 화면이 나타나면 아래와 같이 입력하고 ‘Next’ 버튼을 클릭합니다.

정상적으로 설정되어 진행되었다면 아래와 같이 Target 머신에 접근합니다.
Target 머신의 사용자 계정 이름과 비밀번호를 입력하고 ‘확인’ 버튼을 누릅니다.

다음 화면이 나타나면 Target 머신이 디버기 환경으로서의 역할을 하기 위해 필요한 프로그램 설치가 진행됩니다. 과정 중에 Target 머신이 재부팅되기도 합니다.

   설치가 완료되면 아래와 같은 화면이 나타납니다. ‘Next’ 버튼을 클릭합니다.



다음 화면은 설치가 완료되었고 Target 머신의 상태를 보여줍니다. Visual Studio 2013에서 Target 머신을 제어할 수 있는 환경설정이 완료되었습니다. ‘Finish’ 버튼을 클릭합니다.



6. 자동화 버깅 환경 구축

  6.1. 목표

마지막으로 Host  머신에서 Visual Studio 2013을 이용하여 작성한 드라이버를 디버그 하면 자동으로 Target 머신으로 드라이버 패키지를 전송하고 설치하게 할 뿐 아니라 라이브 디버깅까지 가능하도록 추가적인 환경 설정이 필요합니다.

  6.2. Visual Studio 2013 환경 설정

     6.2.1. 빌드 가능한 드라이버 프로젝트 열기

항목 1.3. 에서 우리는 빌드 가능한 드라이버 프로젝트를 확보 했었습니다.
Visual Studio 2013에서 미리 확보한 빌드 가능한 드라이버 프로젝트를 엽니다.

     6.2.2. 드라이버 패키지 설정

빌드 가능한 드라이버 프로젝트가 열린 상태에서 Visual Studio 상단 메뉴 중 DEBUG > package Properties…를 클릭합니다.

드라이버 페키지를 디버깅 하기 위한 수단을 설정해야 합니다. 이전에 우리는 Visual Studio에서 Target 머신에 접근 가능하도록 설정/등록 했었습니다. 이전에 등록했었던 Target 머신을 디버깅에 이용할 수 있도록 아래의 그림과 같이 설정해야 합니다.

그리고 드라이버를 Target 머신에 전송하고 전송한 드라이버를 자동으로 설치할 수 있도록 설정할 수 있습니다. 자세한 설명은 아래 그림을 참고합니다. Driver Installation Options에서 전송한 드라이버를 자동 설치 여부를 결정할 수 있고, 자동으로 설치 할 경우 어떠한 방식으로 설치 할 것인지 설정할 수 있습니다.

기존에 설치했던 드라이버에 다른 장치가 매칭 될 수 있도록 하드웨어 아이디를 추가할 수도 있고, 별도의 스크립트를 통해 드라이버를 설치할 수도 있습니다. 자세한 내용은 아래의 링크에서 확인할 수 있습니다. 자신이 원하는 옵션으로 설정을 완료하면 ‘확인’ 버튼을 클릭합니다.



     6.2.3. 원격 커널 디버깅 실행

현재 Visual Studio 2013에 열려있는 드라이버 프로젝트를 디버깅 합니다.

디버깅이 진행되면 아래와 같은 화면이 나타나면서 Target 머신에 드라이버 패키지를 전송 합니다.   Target 머신에 자동으로 설치 될 수 있도록 설정 해둔 상태라면 Target 머신에서는 드라이버 설치를 시도합니다.

우리가 전송한 드라이버 패키지는 기본적으로 Target 머신의 C:\DriverTest\Drivers\ 경로에 저장 됩니다. 만약 우리가 자동으로 드라이버를 설치하도록 설정하지 않았다면 독자분들이 직접 해당 경로의 드라이버 패키지를 수동으로 설치할 수 있습니다.


     6.2.4. 간단한 사용 방법 확인

디버깅이 진행 중이면 아래의 그림과 유사한 화면의 Visual Studio 구성을 확인할 수 있습니다. 빨간 테두리 안에 인터페이스로 Target 머신의 동작을 정지/재개 할수 있습니다.
커널 디버깅을 진행하고 있기 때문에 일시정지 버튼을 누르면 Target 머신의 동작은 멈춥니다. 참고로 Visual Studio 2013에서 사용하는 커널 디버거는 WinDBG를 합니다.

따라서 이미 WinDBG의 경험이 있는 독자분들은 쉽게 제어할 수 있을 것이라 생각합니다.

위와 같은 흰색 바탕의 인터페이스에서 직접 여러가지 명령어를 입력할 수 있을 뿐 아니라 Call Stack, Memory 정보를 확인할 수 있는 인터페이스를 활용할 수도 있습니다.

그리고 아래 그림과 같이 직접 해당 프로젝트의 소스코드 파일에서 Break Point를 설정할 수 있습니다.

자세한 인터페이스 셋팅과 활용 방법은 해당 칼럼 주제인 ‘환경 설정’과 거리가 멀기 때문에 생략하겠습니다.



7. 마치며..

해당 칼럼을 작성하는데 도움을 주신 개발2 팀원들께 감사의 뜻을 전합니다.
그리고 칼럼의 내용을 감수해 주신 곽태진 소장님께도 감사의 뜻을 전합니다.

이번 칼럼을 통해 많은 사람들이 좀 더 쉽고 귀찮은 일 없이 커널 디버깅 환경을  구축할 수있으면 좋겠습니다.

  * 글 작성을 위해 참고한  페이지 : Wikipedia.org, msdn.com
  * 글 작성을 위해 참고한 문서 : usb 3.0 specification 



post by
박현욱 연구원