2008년 7월 2일 수요일

emacs + gdb 편하게 디버깅하기

이전에 적었던 글
http://oldpie.yoonkn.com/cgi-bin/moin.cgi/DebuggingWithEmacs
http://oldpie.yoonkn.com/cgi-bin/moin.cgi/using_GDB
새 위키에 적기전에 잠시 정리. emacs 와 gdb 로 디버깅하기 란 페이지에 정리할 생각.

emacs 에서 gdb 를 visual studio 와 유사한 키바인딩으로 사용하기

(global-set-key [f9] 'gud-break)        ; 소스창에서 바로 브레이크포인트 설정
(global-set-key [f10] 'gud-next) ; 현재 라인 실행하고 다음 라인으로
(global-set-key [f11] 'gud-step) ; 현재 함수안으로 따라 들어간다
(global-set-key [(shift f11)] 'gud-finish) ; 현재 실행중인 함수 리턴후 멈춤
(global-set-key [(shift f10)] '(lambda () ; 현재 커서까지 실행하고 멈춤
(interactive)
(call-interactively 'gud-tbreak)
(call-interactively 'gud-cont)))

흠 recenter-top-bottom 을 매번 불러서 커서를 화면 중앙으로 유지하는 것도 편할거 같은데 아직 시도는 안해봤다. 지금도 그렇게 불편하진 않다..


아래 스샷처럼 여러 윈도 같이 띄우기
사용자 삽입 이미지

(setq gdb-many-windows t)

내가 원하는 윈도를 따로 프레임으로 띄우기
내 모니터가 작아서 저렇게 놓고 디버깅하긴 좀 불편하다. 자주 쓰는 gdb 콘솔윈도우는 따로 프레임으로 뽑아내서 아래 그림처럼 alt-tab 으로 전환해가면서 사용하는게 더 편하다.
사용자 삽입 이미지

조렇게 쓰려면 위쪽 gdb 창에가서 C-x 5 2 를 누르거나 아니면 GUD 메뉴를 써먹자.
따로 뜬 프레임만 닫을때는 C-x 5 0

간단한 .gdbinit 사용
정말 최소한의 것만 적자면
  1. pretty print 켜주고,
  2. emacs 상에서 M-x gdb 로 gdb 띄울때 매번 arg 세팅을 피하기 위해서 set args 해주고
  3. 몇몇 중요한 함수들 브레이크를 미리 잡아둔다.
정도... 예를들어 .gdbinit 을 요런식으로 만들어주자.
set print pretty on
set args -B 200 --frames 5 -o /tmp/output.264 /tmp/foreman_352x288_30fps_449.yuv 352x288
b x264_me_search_ref

어떤 타입의 정보를 자주 살펴봐야 할때
gdb 의 print 명령이 꽤나 좋지만 아주 복잡한 구조체가 있고 그중 일부 멤버만 디버깅에 필요하다면 매번 print 하는건 상당히 귀찮다. 아래에 언급한 STL 디버깅 스크립트 처럼 gdbinit 안에 적당한 디버깅용 함수를 만들어서 이걸 이용하는 방법도 있지만 대부분의 경우 가능하면 소스안에 포함하는게 좋다고 본다.( 물론 STL 은 내부구현이 가려져 있으니 소스내에서 뽑는건 오히려 좋지 않겠지, msvc 도 유사한 기능이 있을테니 이런건 디버거 레벨에서 처리하는게 맞을듯) 예를들어 아래 같은 코드가 있으면
사용자 삽입 이미지

디버깅시 int 값이 필요할때마다 gdb 상에서 call dump_int(foo) 를 통해서 값을 출력해볼수 있다.

사용자 삽입 이미지




좀더..

댓글 없음: