레이블이 디버깅인 게시물을 표시합니다. 모든 게시물 표시
레이블이 디버깅인 게시물을 표시합니다. 모든 게시물 표시

2008년 11월 12일 수요일

GDB 텍스트 유저 인터페이스 gdbtui




http://sourceware.org/gdb/current/onlinedocs/gdb_24.html

보통 디버깅시 emacs 상에서 gud 물려서 하지만 간단한 디버깅을 할때는 그냥 콘솔에서 gdb 를 띄우는데 이때 list 로 소스보는건 짜증나는 일이니 gdbtui 를 좀더 활용해보자...

  • gdb 때리는 버릇때문에 -tui 옵션을 주거나 gdbtui 로 띄울일은 없고.. 그냥 gdb 로 띄우고 적당히 디버깅하다가 소스뷰가 필요하면 C-X a 로 tui 모드로 전환하자. 필요없을경우 다시 C-X a 로 원래 모드로 돌아갈수도 있다.
  • 음 사실 내가 쓰는건 이게 전부.. 내가 어셈코드나 레지스터를 볼 이유도 없고..  소스뷰 하나 보이는 레이아웃이면 충분하다.
  • 혹시나 다른 레이아웃을 쓴다면 이맥스 단축키와 유사하니 외울것도 없고..
  • 손가락에 단축키 외울 용량이 남으면 싱글키 모드는 한번 써보고 싶은데 이거 쓰느니 그냥 emacs 에서 gud 띄우자. 정 필요하면 단축키 바꾸는 방법을 찾아보고..
  • 한글지원(주석에 한글등이 포함된 경우)이 어색하고.. 이것때문인지(?) 가끔 화면이 깨진다. 상당히 짜증나서 gdbtui 를 잘 안쓰게 되는 원인.

2008년 11월 3일 월요일

Virtual Machine-Based Replay Debugging 가상머신을 통해 프로그램실행을 녹화하고 재생해가며 디버깅하는 데모

http://kr.youtube.com/watch?v=RvMlihjqlhY


  • google techtalks 에 잼나는게 보이길래 구경해봤다. 끝까지 본건 아니고 대략 40분정도만 시청. 뭐 별내용은 없으니. 거기에 양키말 듣는척하는건 정말 스트레스.
  • 간단히 정리하면 프로그램이 돌아가는 꼴을 vmware 가 죄다 recording 을 하고(물론 모든 이벤트/상태들을 기록하는 무식한 방법이 아니고 input 이나 인터럽트 등 쌩뚱맞은 것들만 기록) 이 기록을 replay 해가면서 디버깅을 한다는것. 데모가 포함된 영상이니 꽤나 볼만하다. 만약 다시 봐야 한다면 대략 21:00 부터 보자.
  • 버그가 일어난 상황을 개발자가 만들어내는게 아니고 테스터가 만들어내서 그 상황을 개발자에게 패스해주는게 아주 맘에 드네. 뭐 그다지 새로운 아이디어라곤 생각되지 않지만 구현되서 돌아가는건 처음보는것 같다. 물론 아직은 이렇게 활용할 단계는 아니고 더 잘만들어진다면 정말 이런식으로 테스터들을 굴리는게 가능해질날이 올듯.
  • 뭐 굳이 테스터가 상황을 만드는게 아니더라도.. 개발자가 이짓을 하더라도 의미가 있지. 어떤 프로그램이 여러개의 다른 리모트 머신이나 프로세스와 상호작용을 할때 디버깅 환경을 맟추려면 혼자선 힘든 경우가 있는데(최악의경우 관련자 여려명이 한명 디버깅을 돕기위해서 시간을 버리는 경우도 있고) 이때 근사하게 하나 레코딩해서 디버거로 혼자 곱씹을수 있다면 정말 좋겠지.
  • 거꾸로 실행을 해볼수도 있다. reverse continue 라고 표현을 하면서 브레이크걸고 거꾸로 돌리는걸 데모에서 보여주는데 잘쓰면 편리할듯.

  • 나에게있어서의 실용성은 좀 의문이 드는데.. 적어도 몇년안에 내가 이걸 다시 관심가질 일은 없어보인다. 회사를 옮기지 않는한.
  • gdb 메인테이너가 참여해서 듣고있던데 gdb 가 이기능을 지원해줄지 모르겠네. visual studio 쪽에서만 지원하면 나한테는 일단 비호감.

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) 를 통해서 값을 출력해볼수 있다.

사용자 삽입 이미지




좀더..