2010. 7. 20. 17:53 과거 저장소/Device Driver
728x90

예전에 대충 알고 있었던 부분들을 이 책을 통하여 다시금 정리하고 있다.
오늘 읽은 페이지 : 1~107 page

- 유저모드 라이브 디버깅 정리

WinDbg를 이용하여 응용프로그램에 연결하는 방법 3가지
1.
WinDbg에서 응용프로그램 실행하기(Debugger에서 Debugee 실행)
  - File -> Open Executable메뉴를 이용하여 원하는 응용프로그램을 선택한다.
  - 선택 후 열기를 누르면 프로세스 초기화가 끝난 후 main()함수 진입전 한번 멈춘다.
  - 이때 원하는 함수에 BreakPoint를 설정 한 후 g or F5를 눌러 진행하게 된다.

2. 실행중인 응응프로그램에 WinDbg 붙이기(Debugger를 Debugee에 붙이기)
  - 주로 특별한 조건으로 실행된 상태의 응용프로그램을 디버깅해야 할 때나 서비스 프로세스를 디버깅해야 할 때 사용
  - File -> Attach to a Process메뉴를 이용하여 현재 실행중인 프로세스들 중 디버깅을 원하는 프로세스를 선택한다.
  - 다음은 프로세스 초기화 후 멈추게 되는데 여기선 main()함수는 이미 실행되어 지나간 후 라 어떤 부분에서 멈춘지는 알 수 없다.
  ※ WinDbg를 종료하면 실행중이던 응용프로그램도 같이 종료하게 된다. 이것을 막기 위하여 위 Attach 설정창엣 Noninvasive를 선택하면된다. WindowsXP부터는  Noninvasive모드를 사용하지 않아도 qd(Quit and Detach)명령을 이용하여 동일한 기능을 기대할 수 있다.

3. 응용프로그램 실행 중 문제가 발생했을 때 자동으로 WinDbg 실행하기
  - 위 말처럼 응용프로그램의 실행 중에 문제가 발생 시 알아서 자동으로 WinDbg를 실행해준다.
  - 이 기능은 레지스트리에 존재하는 AeDebug키를 이용한다.
    C:\Users\acedon>windbg -I

BreakPoint의 사용
  - bp(BreakPiont)라는 명령어를 사용하여 원하는 곳에 디버깅을 시작할 수 있다.
  - 사용 예) 0:001>bp MyApp!CMyAppDlg::OnBreakPoint
  ※가급적 MyApp처럼 모듈명을 적어주는 것이 명령 실행 시간이 줄어든다.
  - bl(BreakPoint List)라는 명령어는 Breakpoint걸린 목록을 보여준다.
  - 사용 예) 0:001>bl
                    0  e  00401b3e          0001   (0001)   0:**** MyApp!CMyAppDlg::OnBreakPoint
  - 맨 앞 0은 ID로서 0번 브레이크 포인트라는 의미
  - e 는 enable되어 있다는 의미
  - 00401b3e는 breakpoint설정된 주소값
  - 0001은 브레이크 포인트 패스 카운트로서 브레이크 포인터를 1번 만나면 정지해 달라는 의미! 0002였다면 첫 번째 BP가 걸렸을 때는 무시하고 두 번째 브레이크 포인트가 걸렸을 때 정지한다
  - ****은 스레드 지정을 표시함, 스레드 번호 없이 ****가 붙었으면 모든 스레드에 대해서 브레이크 포인트 적용!
  - 나머지 부분은 함수 이름이다.
  - be(Breakponit Enable), bd(Breakpoint Disable)를 이용하여 브레이크 포인트의 사용을 제어 할 수 있다. ex)bd 0  //disable , be 0  //enable
  - bc(Breakpoint Clear)를 이용하여 정의된 브레이크 포인트를 해제한다. ex)bc 0  //0번 브레이크포인트 해제, bc *  //모든 브레이크, bc 3-5, bc 2,7,8
  ** bu명령어는 bp명령어와 동일한 목적으로 사용되나 디버깅을 종료한 후 다시 시작할 때에도 브레이크 포인트가 유지된다는 사실이다.


Call Stack 확인
  - 디버깅 중 브레이크 포인트가 걸렸을 때 대부분 먼저 하는 일은 콜 스택(call stack)확인이다. 어떤 함수들이 어떤 순서로 해당 함수를 호출했는지 확인하는 것이 디버깅의 시작점이 되는 경우가 많기 때문이다. 콜스택을 보는 방법은 두가지가 있다.
  1. 콜 스택 창을 띄워서 보는 방법(File -> View -> Call Stack(ALT+6))
  2. 명령창에서 k명령(Display Stack Backtrace)으로 보는 방법

728x90
posted by acedon