본문 바로가기

프로그램언어/C++

gdb을 이용한 디버깅.


  리눅스 프로그래밍을 하면서 kdeveloper 및 eclipse 기타 응용툴이 더 있을 것이다. K는 자체 콘솔창에 의한 디버깅에 상당히 유용하다. 내가 필요한 정보를 보기에도 상당히 편하다는 장점을 가지고 있다. eclipse는 프로그램에 필요한 플러그인 및 기타 응용툴에서 탁월한 기능을 가지고 있어 실제 프로그래밍을 할때 너무 유용하였다. 하지만 k처럼 콘솔창에 디버깅 또는 ui에서 디버깅 할 때 약간의 불편함이 있다. ( 뭐 편하다고 하는 분들도 물론 있지만, 가끔 죽는 버그가 있다. 자바버전에 대한 문제라고 하는 분들도 있고, 정확히 뭐라 딱 찝어서 말하기는 ... 쩝 )

  여기서 디버깅하는 것은 eclipse 기반으로 정의 해볼까 한다. 뭐 지금 사용하고 있으니깐..^-^;; 툴에서 하는 디버깅하는 방법이야 뭐 금방 습득이 가능하다. 하지만, 콘솔에서 정의한 문서들이 많이 있지만, 내 나름데로의 문서가 필요해서 다음과 같이 정리한다.

1. 실행파일에 접근하여 디버깅.
  전체::
  리눅스 머신에서는 테스트하기 위한 실행 파일이 복잡하게 마구마구 빙빙돌구 있다. 여기서 프로세서를 납치하여 그 프로세스를 가지고 디버깅하는 방법에 대해 정리한다. 기존에 구글에서 gdb디버깅하기 하면 수 많은 문서들이 쏟아져 나온다. 그 내용들을 공부를 하면서 실제로 디버깅을 하고 그에 따르는 방법을 습득하는데 있다.
 콘솔에서 다음과 같이 입력하였다. 한글이 깨지는 문제로 다음과 같이 설정하였다.
$ export LANG=C
$ ps -ef | grep testCode
1000     6230      1       0     17:40   pts/9     00:00:01     ./testCode
1000     7002   6929     0      17:50   pts/11    00:00:00    grep   testCode

$ gdb -p 6230 testCode  또는 $ gdb testCode
.
.
.
.
Reading symbols from /usr/lib64/libXext.so.6...done.
Loaded symbols for /usr/lib64/libXext.so.6
Reading symbols from /usr/lib64/libX11.so.6...done.
Loaded symbols for /usr/lib64/libX11.so.6
Reading symbols from /lib64/libresolv.so.2...done.
Loaded symbols for /lib64/libresolv.so.2
Reading symbols from /usr/lib64/libsasl2.so.2...done.
Loaded symbols for /usr/lib64/libsasl2.so.2
Reading symbols from /usr/lib64/libicudata.so.38...
warning: Lowest section in /usr/lib64/libicudata.so.38 is .hash at 0000000000000158
done.
Loaded symbols for /usr/lib64/libicudata.so.38
Reading symbols from /usr/lib64/libXau.so.6...done.
Loaded symbols for /usr/lib64/libXau.so.6
Reading symbols from /usr/lib64/libxcb-xlib.so.0...done.
Loaded symbols for /usr/lib64/libxcb-xlib.so.0
Reading symbols from /usr/lib64/libxcb.so.1...done.
Loaded symbols for /usr/lib64/libxcb.so.1
0x00007fd31fdd7785 in pthread_join () from /lib64/libpthread.so.0
(gdb) ( 만약에 -p 옵션에 프로세스을 붙이지 않으셨다면 어떤 프로세스를 사용해야 되는지 정의해야 한다. )
(gdb)  attach 6230  ( 앞에서 프로세스를 붙이지 않았다면 다음과 같이 어떤걸 써야되는지 정의해야 한다.)
(gdb)

여기서 필요한 정보에 대해 breakpoint을 정의 할 수도 있고, 디버깅이 가능한 기본설정을 끝냈다. 여기서 해야 할일이 무엇이 있을까 필요한 정보는 watch로 정의해 데이터를 보면 될 것이고, 확인해야 될 부분에 break을 걸어 그 안에 있는 메모리의 데이터를 확인하는 것이다.