내 잡다한 노트

gcc, Make, gdb 본문

DevOps/리눅스

gcc, Make, gdb

peanutwalnut 2023. 3. 23. 16:04

gcc

리눅스 환경에서 컴파일을 실행할 수 있는 툴

컴파일에 필요한 전처리기, 컴파일러, 어셈블러, 링커를 호출

gcc [-옵션] <컴파일 할 파일명> 

옵션                내용                              사용법

-o         출력할 파일명을 지정           gcc -o (출력파일) (컴파일 할 파일들)

-c         링크를 하지 않음                  gcc - c (컴파일 할 파일)

             오브젝트 파일을 출력

 

Make

Make를 쓰는 이유
- 각 파일에 대한 반복적 명령의 자동화로 인한 효율성 증가
- 프로그램의 종속 구조를 빠르게 파악할 수 있으며 관리가 용이하다.
- 많은 c소스들중에 하나를 수정해도 make를 하면 전체 재 컴파일을 할 수 있다.

vi Makefile 로 파일을 만든다.

 

make 구성
- 목적파일(Target) : 명령어가 수행되어 나온 결과를 저장할 파일 (목적 or 실행파일)
- 의존성(Dependency) : 목적파일을 만들기 위해 필요한 재료
- 명령어 (Command) : 실행 되어야 할 명령어들, 반드시 tab 들여쓰기 후 작성해야함.
- 매크로 (macro) : 코드를 단순화 시키기 위한 방법

 

타겟절 : 의존성
실행할 커맨드

형식으로 작성한다.

매크로를 이용하면 편하다 매크로란 Makefile에서 편리하게 사용하기 위해 미리 정의된 변수.

$( ... )를 권장

 

make 명령 내부에 정의된 매크로

$^ : 현재 타겟의 종속 항목 리스트

$* : 현재 타겟 이름 (확장자 제외)

 

.SUFFIXES : .c .o 

파일의 확장자를 보고 그에 따라 적절한 연산을 수행시키기 위한 규칙

 

gdb

디버깅 도구.

디버깅을 보다 쉽게 하고 싶다면 gcc 컴파일 시 -g 옵션을 사용

 

- 사용법

gdb [프로그램] : 프로그램을 디버깅

q 또는 quit : gdb 종료

 

gdb가 symbol table을 찾지 못할땐 file 프로그램이름 을 통해 연결해줘야 한다.

  1. file 명령을 사용하여 디버그하려는 프로그램을 지정하십시오. 예를 들어 프로그램 이름이 my_program인 경우 file my_program 명령을 실행할 수 있습니다.
  2. 프로그램이 디버깅 기호로 컴파일된 경우 GDB는 자동으로 기호 테이블을 로드하고 "Reading symbols from my_program...done"과 같은 메시지를 인쇄해야 합니다.

그리고 꼭 컴파일할때 -g를 포함하게끔 해야함.

gcc -g your_program.c -o your_program

 

 

- 명령어

run : 디버깅 할 프로그램의 수행 시작

줄여서 r로 쓴다

set [variable = value] : 변수 값 설정

continue : breakpoint 등으로 멈춰진 프로그램 수행

줄여서 c 로 쓴다.

kill : 디버깅 중인 프로그램 강제 종료

줄여서 k로 쓴다

next [n] : 멈춰진 프로그램에서 다음 n개의 문장을 수행한 후 멈춤

줄여서 n으로 쓴다

step [n] : next와 동일하나 함수가 있을 경우 함수 내부로 들어가서 수행

print [variable] : 변수의 값, 함수의 리턴 값 확인

줄여서 p로 쓴다.

Break [line-number] : 특정 위치인 line-number에 오면 프로그램 정지

b func : func 함수의 시작부분에 브레이크 포인트 설정

b 10 : 10행에 브레이크 포인트 설정

info b : 현재 브레이크 포인트 보기

d : 모든 브레이크 포인트 지우기

list : 소스보기

Delete [N] : N번 breakpoint 제거

watch [변수명] : 특정변수에 와치 포인트를 설정하고, 특정변수가 바뀔 때마다 브레이크가

걸리면서 이전/현재 값을 출력한다.

 

 

 

'DevOps > 리눅스' 카테고리의 다른 글

리눅스 보안 방화벽에 관해  (1) 2023.09.02
fork( ) 정의와 특징  (0) 2023.04.08
vi 복사 명령어  (0) 2023.04.05
특정 문자 및 문자열을 vi에서 찾기 명령어  (0) 2023.03.29
리눅스 명령어 정리  (0) 2023.03.17