What is make?
make는 프로그램 그룹을 유지하는데 필요한 유틸리티이고, 명령어 방식으로 처리되는 모든 곳에서 쓰일 수 있다. Makefile은 make가 이해할 수 있도록 일종의 쉘 스크립트 언어같이 되어있다. 프로그램 개발에서 여러 파일과 관계있는 하나의 함수를 바꾸게 되었을 때 그 파일에 있는 함수를 이용하는 다른 파일도 새롭게 컴파일되어야 한다. 그러므로 파일 수가 많은 경우 불편함이 생기고 실수가 생기게 된다. 따라서 make를 사용하는것이 편리하다.

Makefile의 내부 구조

makefile은 목표(target), 의존 관계(dependency), 명령(command)의 세개로 이루어진 기본적인 규칙(rule)들이 계속적으로 나열되어있는 형태이다. 명령 부분은 꼭 TAB 글자로 시작해야 한다.

Makefile 예제

매크로의 사용

레이블의 사용

매크로와 확장자 규칙
매크로란 특정 코드를 간단하게 표현한 것이다. make에는 아래 그림과 같이 미리 정해져 있는 매크로가 있다.

미리 정해져 있는 매크를 아래의 그림과 같이 활용할 수 있다.

확장자 규칙이란 파일의 확장자를 보고, 그에 따라 적절한 연산을 수행시키는 규칙이다.

References
makefile Full Guide
– http://wiki.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make-1.html
makefile Tutorial
– http://www.opussoftware.com/tutorial/TutMakefile.htm
List of Commands
– http://www.smashingmagazine.com/2010/05/03/vi-editor-linux-terminal-cheat-sheet-pdf/

What is gdb?
디버거의 목적은 프로그램 실행동안 프로그램 내부에서 진행되고 있는 것이 무엇인지를 알도록 하는데에 있다. (또는 다른 프로그램이 종료되는 순간에 무엇을 했는지) gdb는 프로그램을 시작할 때 프로그램의 행동에 영향을 줄 수 있는 것을 지정할 수 있고, 프로그램을 지정된 조건에서 멈추도록 만든다. 또한 프로그램이 멈추었을 때 무엇이 일어났는지를 시험할 수 있다.

디버그용 컴파일 하기
디버그 하기 전에, 디버그 하고자 하는 프로그램에 디버깅 정보를 컴파일 한다. Gdb가 사용했던 변수, 라인 및 함수를 실행할 수 있게 된다. Gcc에서 ‘g’ 옵션을 이용하여 프로그램을 컴파일 한다.
$ gcc -g example.c -o example

gdb 실행하기
gdb는 쉘에서 ‘gdb’ 명령으로 실행된다. gdb에서 파일 명령으로 디버깅 용 프로그램을 로드할 수 있다. (예 : ‘file example’). 프로그램과 동일한 디렉토리에서 명령이 실행되어, 일단 로드 되면 gdb command인 ‘run’으로 프로그램이 시작한다.

디버깅 세션의 예제
예제코드는 루프문을 통해 곱셈 결과를 출력하고, 마지막에 assert 문을 이용하여 강제로 오류를 발생시켜 종료하는 프로그램이다.

디버깅 정보를 삽입하여 컴파일 한다.

gdb를 실행하면, gdb 정보와 함께 (gdb) 콘솔 command창으로 바뀐다. gdb 상에서 이 예제 프로그램을 실행한다. 명령어는 ‘run’ 이다.

assert문 때문에 SIGABRT 시그널 메시지와 함께 프로그램이 종료된다. 해당 프로그램의 소스를 보기 위해서는 ‘list’ 을 입력한다.

함수 호출에 대한 스택 추적은 ‘backtrace’를 통해 확인할 수 있다. main ☞__assert_fail ☞ abort() ☞ raise() ☞ __kernel_vsyscall() 순으로 함수 호출이 되는 것을 확인할 수 있다.

‘break 라인번호’를 통해 브레이크 포인트 위치 설정 할 수 있다.

gdb를 재실행 하여 브레이크 포인트 확인 할 수 있다.

‘run’ 명령 해보면 해당 라인에서 프로그램이 gdb로 제어권이 넘어온다. ‘print’ 명령을 사용하여 각 변수의 값을 확인할 수 있다. ‘display’ 명령은 한번 설정해두면 변수의 값을 각 단계마다 자동적으로 보여준다. 브레이크 포인트부터 이어서 수행하려면 ‘cont’를 입력한다. ‘step’ 명령 함수의 내부까지 추적해 들어간다. ‘s’로 실행 ‘next’ 명령은 해당 함수를 한 줄로 보고 그 다음 줄로 넘어간다. ‘n’로 실행


현재 설정된 브레이크에 대한 정보는 ‘info break’ 명령으로 확인 할 수 있다. 설정한 브레이크 지점은 ‘disable’ 명령을 사용하여 해제할 수 있다. ‘disable’ 명령으로 브레이크를 해제하는 지점은 라인번호가 아니라 설정 순서의 번호이다. (info로 확인했을 때의 번호)

프로그램 작업 디렉토리

프로그램의 입력과 출력

이미 실행중인 프로세스 디버깅하기

자식 프로세스 죽이기

브레이크 포인트 설정

스택 프레임
콜 스택은 stack frames 또는 frames 라 불리는 연속적인 조각으로 나누어진다. 각 프레임은 하나의 함수에 하나의 호출이 관련된 데이터이다. 프레임은 함수에 주어지는 인자와 함수의 지역 변수들 그리고 함수가 실행하는 주소를 포함한다.

backtraces
프로그램이 어떻게 돌아가는지에 대한 요약이다. 현재 실행되는 프레임에서 시작하여 호출자(프레임1)가 뒤따라오고 그리고 스택위에 있는 많은 프레임을 위해 프레임당 한 라인씩 보여준다.

프레임 선택하기
프로그램에서 스택이나 다른 데이터를 검사하는 대부분의 명령어들은 그 순간에 선택된 스택 프레임에서 작동한다.

소스 라인 출력하기
소스 파일에서 라인을 출력하기 위해 list 명령어를 사용한다. 기본적으로 10라인이 출력된다. 출력하기를 원하는 파일의 일부를 지정하기 위한 여러 가지 방법이 있다.

소스 파일 찾기
정규식 표현식을 위해 현재 소스 파일 탐색을 위해 두개의 명령어가 있다.

소스 디렉토리 지정하기
실행 프로그램은 가끔 컴파일된 디렉토리에서 소스 파일의 디렉토리를 기록하지 않는다. 컴파일될때, 디렉토리들은 컴파일과 디버깅 세션 사이에 이동될 수 있다. GDB는 소스파일을 찾기 위한 디렉토리 리스트를 가지고 있다

데이터 검사하기
프로그램에서 데이터를 검사하기 위한 일반적인 방법은 print 명령어나 동의어인 inspect이다.

표현식
print와 많은 다른 GDB 명령어들은 표현식을 받아들이며 그 값을 계산한다. 사용하는 프로그래밍 언어에 의해 정의된 상수, 변수 또는 연산자는 GDB의 표현식에서 유효하다. 이것은 추가적인 표현식, 함수 호출, 캐스팅 그리고 문자열 상수를 포함한다. 전처리기 #define 명령어들에 의해 정의된 심볼들은 포함되지 않는다.

프로그램 변수들
사용시 가장 일반적인 표현은 대부분의 프로그램에서 변수 이름이다. 표현식에서 변수들은 선택된 스택 프레임에서 이해된다.

프로그램이 이미 함수 foo 내에서 실행될 때는 언제나 변수 a를 시험하고 사용할 수 있다. 그러나 프로그램이 b가 선언된 블럭내에서 실행되는 동안 b만을 사용하고 검사할 수 있다.

인공배열
이것은 메모리내 같은 타입의 연속적인 객체들을 출력하는데 유용하다.

출력 형식
기본적으로 GDB는 데이터 타입에 따라서 값을 출력한다.

메모리 검사하기
프로그램의 데이터 타입에 의존하지 않고 여러 형식으로 메모리를 검사하기 위해 x 명령어를 사용할 수 있다.

자동 디스플레이
표현식 값을 자주 출력하기를 원한다면, gdb가 프로그램을 멈출 때 마다 해당 값을 출력하도록 하기 위해 표현식을 자동 디스플레이 리스트에 추가한다.

print 설정하기
GDB는 배열, 구조체 그리고 심볼들을 출력하는 방법을 제어하기 위해 다음 방법을 제공한다.

References
GDB Full Guide
– http://korea.gnu.org/manual/release/gdb/gdb.html
Simple Guide
– http://hermet.pe.kr/88589788