Windows Debugging
유저모드 라이브 디버깅
방마리
2020. 4. 6. 01:18
유저모드 라이브 디버깅이란 특정 프로세스를 라이브 디버깅하는 것이다.
흔히 소프트웨어를 개발할 때 사용하는 비주얼 스튜디오를 통해 디버깅을 할 수 있음에도 WinDbg를 사용함으로써 얻는 장점은 무엇이 있을까?
※ WinDbg는 "Debugging Tools for Windows" 를 의미하며 흔히 "윈디비지" 정도로 읽는다.
- WinDbg는 명령 입력을 지원하므로 각종 디버깅 명령을 사용할 수 있다. 프로세스, 스레드 정보, 모듈 정보, 버전 정보, 메모리 등을 WinDbg가 제공하는 명령으로 쉽게 조회할 수 있으므로 세세한 디버깅을 할 수 있다.
- 이미 실행 중인 프로세스에 붙여서 디버깅할 수 있다. 서비스 같은 것을 디버깅할 때 유용하다.
- 비주얼 스튜디오 같이 비교적 무거운 툴 없이도 디버깅이 가능하다. WinDbg만 설치하고도 자유롭게 디버깅할 수 있다.
WinDbg를 특정 프로세스(MyApp.exe)에 연결하는 세 가지 방법
- WinDbg에서 MyApp.exeㄹ를 실행하면서 연결하는 방법
- 이미 MyApp.exe가 실행된 상태에서 WinDbg를 나중에 연결하는 방법
- MyApp.exe가 먼저 실행된 상태에서 어떤 문제가 발생했을 때 자동으로 WinDbg가 연결되는 방법
기타 메모
- 콜스택 창에서 Raw args를 선택하면 각 함수로 전달된 파라미터들이 보인다.
엄밀히 말하면 스택으로 파라미터를 전달하는 함수라면 파라미터들이 4개까지 정확히 보이고, 그렇지 않은 함수라면 이 값들은 엉뚱한 값이다.
즉, 32비트 프로그램 대부분은 스택으로 파라미터를 전달하기 때문에 의미가 있지만, 64비트 프로그램은 최초 파라미터 4개를 스택으로 전달하지 않고 레지스터로 전달하기 때문에 사실상 의미가 없다. - 지역 변수 조회시 소스 코드에 존재하는 모든 지역변수를 보여주지 못 하는 경우가 있는데, 이는 최적화(Optimization)로 인해 발생하는 현상이다.
비주얼 스튜디오로 디버깅할 때는 디버깅 버전으로만 디버깅하므로 이런 현상을 볼 수 없다.
디버그 빌드는 최적화 스위치가 꺼져있으므로 지역변수를 모두 정직하게 스택에 저장하는 코드를 생성해낸다. 하지만 릴리즈 빌드의 경우 최적화 옵션을 'Minimize Size'로 설정한다면 반복되는 코드를 줄이면서 일부 지역변수를 스택에 저장하지 않고 레지스터에 저장해 지역변수 창에는 보이지 않을 수 있다.
'Maximize Speed'로 설정하면 컴파일러는 가급적 레지스터를 많이 사용하려고 노력하므로 변수들이 더 많이 보이지 않을 수 있다.