리눅스에서 GDB를 이용한 디버깅 하기
리눅스에서 GDB를 사용하여 디버깅 하기
사실 윈도우 환경에서는 visual C++를 사용하여서 C코드나 C++코드를 쉽게 디버깅 할 수 있는데 리눅스에서 디버깅 할려면 gdb를 제대로 사용할 줄 알아야 한다.
gdb 말고도 XWindow 환경에서의 디버깅 툴인 DDD(Data Display Debugger) 있다. DDD 사용법은 다른 문서에서 다루도록 하겠다.
여기에 디버깅에 관한 설명이 있다. 한번 읽어보고 욕심을 가지자.
gdb를 사용하여 디버깅을 할 수 있는데 아래 표는 많이 쓰이는 명령어
list |
현재 위치에서 소스 파일의 내용을 10줄 보여준다 list 2, 15 : 소스 파일의2 ~ 15 까지를 보여준다. |
run (r) |
프로그램을 시작한다.(break가 있다면 break까지 실행) run arg : 새로운 인수를 가지고 프로그램을 시작한다. arg는 “*”나 “[…]”를 포함할 수도 있다. 쉘의 사용까지도 확장될 수 있다. “<”,“>” , “>>”같은 입출력 방향 재지정기호도 또한 허용된다. |
break(b) |
특정 라인이나 함수에 정지점을 설정한다. break function : 현재 파일 안의 함수 function에 정지점을 설정한다. break file:function : 파일file안의 function에 정지점을 설정한다. watch : 감시점 설정(감시점은 어떤사건이 일어날 때에만 작동한다) until : 실행중 line까지 실행 |
clear |
특정 라인이나 함수에 있던 정지점을 삭제한다. |
delete |
몇몇 정지점이나 자동으로 출력되는 표현을 삭제한다. |
next(n) |
다음 행을 수행한다. 서브루틴을 호출하면서 계속 수행한다. 호출이 발생하지 않으면 step와 같다. next n : 이를 n번 수행하라는 의미 |
step(s) |
한 줄씩 실행 시킨다. 함수를 포함하고 있으면 함수 내부로 들어가서 한 줄씩 실행시킨다. |
print(p) |
print expr : 수식의 값을 보여준다. |
display |
현재 display된 명령의 목록을 보여준다. |
bt |
프로그램 스택을 보여준다. (backtrace) |
kill |
디버깅 중인 프로그램의 실행을 취소한다. |
file |
file program : 디버깅할 프로그램으로서 파일을 사용한다. |
cont |
continue : 현재 위치에서 프로그램을 계속 실행한다. |
help |
명령에 관한 정보를 보여주거나 일반적인 정보를 보여준다. |
quit |
gdb에서 빠져나간다. |
% vi test.c
1 #include <stdio.h> 2 3 main() 4 { 5 int i; 6 double j; 7 /*다음은i/2+i의 값을 출력하는 문이다. 8 i가1이면 j는1.5가 되어야 하지만 실제는 그렇지 않다.*/ 9 for( i=0; i<5 ; i++){ 10 j=i/2+i; 11 printf(“j is %f \n”,j); 12 } 13 } |
% gcc –g test.c –o test
% gdb test
(gdb) list // list는 소스 내용을 10줄씩 보여준다.
1 #include <stdio.h>
2
3 main()
4 {
5 int i;
6 double j;
7 /*다음은i/2+i의 값을 출력하는 문이다.
8 i가1이면 j는1.5가 되어야 하지만 실제는 그렇지 않다.*/
9 ( i=0; i<5 ; i++){
j=i/2+i;
(gdb) b 9 // break 9 : for 문에 이상이 있다고 판단하여 line 9에 breakpoint를 잡는다.
Breakpoint 1 at 0x80483d6: file test.c, line 9.
(gdb) r // run : breakpoint까지 실행된다.
Starting program: /home/pllab/chowing/gdb/a.out
Breakpoint 1, main () at test.c:9
9 for( i=0; i<5 ; i++){
(gdb) s // step : 한줄 실행시킨다.
j=i/2+i;
(gdb) s
11 printf(“j is %f \n”,j);
(gdb) p j // print j : j의 값을 본다.
$2 = 0
(gdb) n
j is 0.000000
for( i=0; i<5 ; i++){
(gdb) display i
(gdb) display j
(gdb) n
11 printf(“j is %f \n”,j);
2: j = 1
1: i = 1
// 10 line에서 실행 후 i=1일 때, j=1이므로 10 line에서 잘못된 것을 알 수 있다.
// 10 line을 j = (double) i/2 + i; 로 고친다.
(gdb) quit
'오픈 플랫폼 BSP > C언어' 카테고리의 다른 글
20100526 - 과제 (0) | 2010.05.27 |
---|---|
자료형과 연산자 (0) | 2010.05.17 |
int형 변수가 범위를 벗어나는 값을 가질 경우 발생하는 오류 (0) | 2010.05.13 |
C언어 컴파일 과정 (VC++ 기준) (0) | 2010.05.12 |
C언어의 기초 컴파일 실습 (0) | 2010.05.11 |