GNU(GNU is Not Unix) 프로젝트의 freeware 컴파일러. 본래 C 언어용 컴파일러로 시작하였으므로 GNU C Compiler의 약자였으나 2.9 버전에 이르러 C뿐만이 아니라 Objective C, Pascal, Ada와 같은 언어도 지원. GNU Compiler Collection으로 개명
컴파일
$ gcc long.c
$ a.out //실행 파일 생성
-c 옵션
$ gcc - c long.c //object file 생성
-o 옵션
$ gcc -o long long.o //실행 파일 이름 지정
혹은
$ gcc -o long long.c
$ long // 실행 파일
-O 옵션
$ gcc -O -o long long.c //optimized compile
compiler가 판단하여 기계어로 번역할 때 최적화 된 실행을 제공
-S 옵션
$ gcc -S long.c //assembly 파일의 long.s 생성
단일 모듈 프로그램: long.c
#include <stdio.h>
#define MAXLINE 100
void copy(char from[], char to[]);
char line[MAXLINE]; // 입력 줄
char longest[MAXLINE]; // 가장 긴 줄
/*입력 줄 가운데 가장 긴 줄 프린트 */
main()
{
int len;
int max;
max = 0;
while (gets(line) != NULL) {
len = strlen(line);
if (len > max) {
max = len;
copy(line, longest);
}
}
if (max > 0) // 입력 줄이 있었다면
printf("%s", longest);
return 0;
}
/* copy: from을 to에 복사; to가 충분히 크
다고 가정*/
void copy(char from[], char to[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
단일 모듈 프로그램
한 코드안에 전부 작성하는 프로그램(단일 모듈 프로그램)
코드의 재사용(reuse)이 어렵다.
여러 사람이 참여하는 프로그래밍이 어렵다.
예를 들어, 다른 프로그램에서 copy 함수를 재사용 하기 힘들다.
다중 모듈 프로그램
다중 모듈 프로그램
여러 개의 .c 파일들로 이루어진 프로그램
일반적으로 복잡하며 대단위 프로그램인 경우에 적합
다중 모듈 프로그램의 예
main 프로그램과 copy 함수를 분리하여 별도 파일로 작성
main.c
copy.c
copy.h //함수의 프로토타입을 포함하는 헤더 파일
컴파일
$ gcc -c main.c
$ gcc -c copy.c
$ gcc -o main main.o copy.o
혹은
$ gcc -o main main.c copy.c
헤더 파일은 안 넣어도 되는 구나?!
main.c
#include <stdio.h>
#include "copy.h" //copy 함수의 원형(프로토타입 선언)
char line[MAXLINE]; // 입력 줄
char longest[MAXLINE]; // 가장 긴 줄
/*입력 줄 가운데 가장 긴 줄 프린트 */
main()
{
int len;
int max;
max = 0;
while (gets(line) != NULL) {
len = strlen(line);
if (len > max) {
max = len;
copy(line, longest);
}
}
if (max > 0) // 입력 줄이 있었다면
printf("%s", longest);
return 0;
}
(gdb) l copy
#include <stdio.h>
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char from[], char to[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i:
}
gdb 기능
정지점 : b(reak), clear, d(elete)b n n번 줄에 정지점을 설정b -n 현재 줄에서 n개 줄 이전에 정지점 설정clear 줄번호 해당 정지점을 삭제
d 모든 정지점을 삭제
info b 현재 설정된 정지점을 출력
b +n 현재 줄에서 n개 줄 이후에 정지점 설정
b [파일:]함수 파일의 함수 시작 부분에 정지점 설정
(gdb) b copy
Breakpoint 1 at 0x804842a: file copy.c, line 9.
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0804842a in copy at copy.c:9
gdb 기능
프로그램 수행
r(un) 인수 명령 줄 인수를 받아 프로그램 수행
k(ill) 프로그램 수행 강제 종료
n(ext) 멈춘 지점에서 다음 줄을 수행하고 멈춤
s(tep) n과 같은 기능 함수 호출 시 함수 내부로 진입
c(ontinue) 정지점을 만날 때 까지 계속 수행
u 반복문에서 빠져나옴
finish 현재 수행하는 함수의 끝으로 이동
return 현재 수행 중인 함수를 빠져나옴
quit 종료
$ (gdb) r
Starting program: /home/chang/바탕화면/src/main
Merry X-mas !
Breakpoint 1, copy (from=0x8049b60 "Merry X-mas !", to=0x8049760 "") at copy.c:98 i = 0;
변수 값 프린트: p(rint)
p [변수명] 해당 변수 값 프린트
p 파일명::[변수명] 특정 파일의 전역변수 프린트
p [함수명]::[변수명] 특정 함수의 정적 변수 프린트.
info locals 현재 상태의 지역변수 리스트
(gdb) p from$1 = 0x8049b60 "Merry X-mas !" (gdb) n9 while ((to[i] = from[i]) != '\0') (gdb) n10 ++i; (gdb) p to$2 = 0x8049760 "M" (gdb) cContinuingHappy New Year !Breakpoint 1, copy(from=0x8049b60 "Happy New Year !", to=0x8049760 "Merry X-mas !") at copy.c:99 i = 0; (gdb) p from$3 = 0x8049b60 "Happy New Year !" (gdb) n10 while ((to[i] = from[i])!='\0') (gdb) n11 ++i; (gdb) p to$4 = 0x8049760 "Herry X-mas !" // Happy....에서 첫 번째 자리에서 break가 걸려 첫 번째 문자에 H가 들어갔다. (gdb) cContinuingCtrl-D 입력Happy New Year ! // 더 긴 줄 프린트Program exited normally.