최초작성 |
2006/12/28 16:43:06 |
gdb 를 쓰면서 유용했던 것들을 적어두는 페이지. Emacs 가 사용가능한 환경이라면 DebuggingWithEmacs 를 참고.
pretty print
set print pretty on
.gdbinit
디버깅을 자주 하는 상황이라면 .gdbinit 을 잘 써먹자
set print pretty on set args -s 352x240 -i ./sample/input.yuv ./sample/output.m4v b main b av_encode
command 명령 써먹기
http://dreamstorm.tistory.com/13 에 적어뒀던것을 옮긴다.
실행흐름이 어떤 브레이크에 도달했을때 지정해둔 명령어들을 실행할수 있다. 여러모로 유용한데 나는 watch 를 위한 목적으로 자주 쓴다. 물론 watch 도 gdb 가 지원을 하지만 command 를 먼저 알게 되서...
예를들어 아래와 같은 코드가 있고
1 if (bits_per_pixel <= 8) 2 for(i = 0; i < height; i++) 3 for(j = 0; j < width; j++) 4 vop->y_chan->data->s[i*width + j] = (Byte) data[i*width + j];
i*width+j 의 값을 매번 찍어보고 싶다면( 뻔한값을 찍는것이니 별의미는 없고 예제삼아서 눈에 보이는 코드를 골라봤다. 그리고 이런용도로는 watch 가 더 적당하다. )
vop->y_chan->data->s[i*width + j] = (Byte) data[i*width + j];
에 브레이크를 건다. 만약 이 브레이크포인트가 6 번이라면
(gdb) command 6 // 6 이 마지막 브레이크 포인트라면 생략가능 Type commands for when breakpoint 6 is hit, one per line. End with a line saying just "end". >silent >print i*width + j >end
요렇게 입력을 해주자. 그러면 매번 브레이크가 걸릴때마다 gud 버퍼에서 이런 결과를 볼수 있다.
Continuing. $12 = 4 Continuing. $13 = 5 Continuing. $14 = 6 Continuing. $15 = 7 (gdb)
매번 break 가 걸리는게 귀찮다면 command 의 마지막 부분에 continue 를 넣어주면 된다.
silent 이짓저짓.. continue end
.gdbinit 안에 포함하려면 요런식으로 하면 된다. command 에 인자를 주지 않을경우 마지막 브레이크포인트에 command 가 걸린다는것을 명심하자.
b main command print argc print argv end
