[windbg] 4차 세미나 ppt - 고급디버깅_김현철
Download
Report
Transcript [windbg] 4차 세미나 ppt - 고급디버깅_김현철
고급 디버깅
20th 김현철
GJSSM
1
조건 브레이크 포인트
kd> bp b8fb429d “.if @@(pData->dwMyFlag &
0x00010000) {} .else {gc}”
• b8fb429d 주소에 조건 브레이크 포인트를 걸리게 하는 상황
• 따옴표 안에 조건문
– 이 예에는 .if{} .else{} 명령을 사용한 조건문
– j 명령을 이용한 조건문은 사용이 불편하여 잘 쓰이지 않음
– .if 명령어는 C언어와 비슷한 형식
• @@( )을 사용하면 괄호 안에 C/C++ 소스코드에서 사용하던 표
현 그대로 사용 가능
– pData->dwMyFlag에서 0x00010000비트가 켜져 있으면 브레
이크 하라는 의미
– 조건이 TRUE가 되면 {} 실행, FALSE가 되면 gc명령 수행
GJSSM
2
심볼 스토어 생성
• MS 웹 심볼 서버처럼 심볼 파일들을 모든 버전에 맞춰 모아 놓은 곳을
의미
–
빌드된모듈을 테스트 할 때마다 심볼 파일을 복사해야되는 번거러움 해결
[기존 방식]
C:\MySymbols\mydrv.pdb (version 1)
C:\MySymbols\mydrv.pdb (version 2) => version 1에 덮어써지면
서 version 2로 변경됨
[심볼 스토어 방식]
C:\MySymbols\mydrv.pdb\55BAFFDE\mydrv.pdb (version 1)
C:\MySymbols\mydrv.pdb\FB126DE0\mydrv.pdb (version 2)
=> TimeStamp 기반 폴더가 생성되고 그 안에 심볼 파일이 복사됨
GJSSM
3
심볼 스토어 생성
• 심볼 스토어 유틸리티 사용 예
symstore.exe add /f C:\Project\Bin\mydrv.pdb /s C:\MySymbol
/t MyProjectSymbol
add 명령으로 심볼 스토어에 파일을 더할 것을 지정
/f 옵션 : 심볼 파일 이름을 입력
/s 옵션 : 심볼 스토어로 사용하려는 위치의 경로를 입
력
/t 옵션 : 이 심볼 스토어의 이름을 입력
여러 버전의 mydrv.pdb를 앞서 보인 방법으로 여러 번 호
출하면 C:\MySymbols 밑에 폴더가 생성되면서 쌓임
GJSSM
4
심볼 스토어 생성
• 배치파일 생성
[AddMySym.bat 내용]
symstore add /f %1 /s C:\MySymbol /t MyProjectSymbol
• 실행
– C:\Test>AddMySym.bat C:\Project\Bin\MyDrv.pdb
– 파일이나 단축 아이콘에 드로그&드롭
• 팁
– 네트워크 공유폴더 사용시 심볼 스토어를 사용하면 팀 모듈,
제품 모듈들에 대한 팀원들이 모두 공유하는 심볼 스토어를
만들 수 있음
– 유저모드 모듈의 경우 타임 스탬프 정보를 정확히 해석하지
못해 WinDbg가 자동으로 찾지 못할 수도 있음. 이럴 때
MyApp.exe도 심볼 스토어에 추가하면 WinDbg는
MyApp.exe를 먼저 찾아 타임 스탬프 정보를 찾은 후
MyApp.pdb가 존재하는 경로를 찾아 로드
GJSSM
5
유저모드 원격 디버깅
• 원격 디버깅을 이용하면 PC1에서 WinDbg를 띄워놓고
PC2에서 띄워놓은 WinDbg를 서로 연결하는 것이 가능
• 테스터 장비에서 응용프로그램에 문제가 발생해 디버깅
을 해야 하는데, 어떤 이유로 메모리 덤프도 생성하지 못
하고 소스코드를 모두 가져가서 디버깅 할 수도 없는 상
황에서 사용 가능
GJSSM
6
유저모드 원격 디버깅
• 문제의 응용프로그램(notepad.exe)이 실행중인 PC1
1) WinDbg를 실행해 디버깅하려는 notepad.exe를 붙임
2) 명령 창에 .server 명령으로 winDbg를 서버모드로 만듬(클라이언
트 WinDbg의 연결을 기다리는 상태가 됨)
•
연결방법은 named pipe, TCP, COM port, secure pipe, secure
socket layer 등이 있음
•
사용방법은 .server npipe:pipe=pipeName[,hidden]
[,password=password][,IcfEnable]
3) 명령줄에 0:001> .server npipe:pipe=remotoDebug 입력
GJSSM
7
유저모드 원격 디버깅
• WinDbg를 실행해 실제로 디버깅 하려는 PC2
1-1) WinDbg를 실행하면서 연결하려면 명령프롬프트에 다음과같이 입
력
C:\Program Files\Debugging Tools for Windows>windbg –remote
npipe:Pipe=RemoteDebug,Server=GREEVAIO
1-2)WinDbg를 실행하고 [File] 메뉴의 [Connect to Remote Session]
을 선택한 후 [Connection string]란에 다음과 같이 입력
GJSSM
8
WinDbg 스크립트
• WinDbg는 반복적으로 어떤 명령을 수행하고 결과를 살펴
보는 작업의 반복적인 문제를 해결하기 위해 스크립트를
지원
– 스크립트 파일에 WinDbg 명령을 적어놓고 순차적으로 실행
– 조건문을 이용해 조건에 따른 분기를 사용할 수 있음
– 명령 결과를 변수로 저장해 다른 명령에 사용할 수 있는 기능 제공
– 프로그래밍 하듯 원하는 분석 작업을 무엇이든 만들 수 있음
GJSSM
9
WinDbg 스크립트
• 4Gb 메모리 시스템 덤프의 물리 메모리 2Gb 위쪽의 데이터가
덤프 파일에 포함되지 않았을때 이를 검증해 보는 스크립트
– 물리 주소 0x80000000부터 0xffffffff까지 0x4000씩 더해가면서
살펴보는 스크립트
– $$는 주석을 의미
– $t0 변수를 초기화하고 변수를 0x4000씩 증가하면서 dc /p 명령 수
행(dc는 메모리 내용을 보여주는 명령, /p는 물리 메모리를 보여주는 옵션)
• WinDbg 설치 폴더 밑에 myscript 폴더를 생성하고
testmem.txt 스트립트 파일 생성(파일명과 확장자는 무엇이든 상관없음)
GJSSM
10
WinDbg 스크립트
• 스크립트 실행 방법
GJSSM
11
WinDbg 스크립트
• 스크립트 작성 기본 사항
– 기본적인 구성은 C언어와 매우 유사하다.
– $t0~$t19는 미리 정의된 가상 레지스터다.
– 스크립트로 파라미터를 전달할 때는 스크립트 명
령이 약간 달라진다.
– 스크립트 중간에 보이는 poi(x)는 x라는 메모리
주소의 내용을 읽는 구문이다.
GJSSM
12
Question
GJSSM
13