리눅스 환경에서 프로그래밍을 한다면 Makefile의 필요성을 절실하게 느낄겁니다. 

Makefile이 있기에 수 많은 파일을 간단한 명령어 하나로 손쉽게 빌드하는게 가능하기 때문입니다. 

문제는 대규모 프로젝트에서 Makefile을 문법에 맞게 작성하는것이 간단한 일은 손이 많이 가고 귀찮은 일일 겁니다. 


이럴 때 autotool을 사용해 보세요. 

초기 설정과 수정이 용이하고, 누구나 쉽게 변경 할 수 있게 해줍니다. 


프로젝트 폴더로 이동해서 아래의 순서에 따라 명령어를 수행해 보세요. 









$ autoscan 

하위 폴더를 검색해서 configure.scan 파일을 생성해줍니다. 

이 파일을 configure.ac로 이름을 변경해서 사용 하면 됩니다. 


파일명을 변경 한 후 configure.ac 파일을 열어서 대괄호로 묶여 있는 변수에 적절한 값을 채워주세요. 



예를 들면  'AC_INIT'에는 이렇게 되어 있을 겁니다. 


AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])


여기에 아래와 같이 현재 프로젝트에 맞게 값을 채워주시면 됩니다.  


AC_INIT(iwinfo, 1.0, bugreports@kthan.co.kr )




$ autoconf 

configure 스크립트를 생성합니다. (동시에 autom4te.cache 파일도 생성해줍니다. )

이 과정을 위해서는 configure.ac 파일이 존재해야 합니다. 

즉, configure.ac 파일에 있는 설정을 참고해서 configure 파일을 생성하는 겁니다. 



$ aclocal

다음 과정인 automake를 하기 위해 필요한 aclocal.m4 파일을 생성해줍니다. 

이 파일에는 automake에서 쓰는 매크로(macros)에 대한 내용이 들어있습니다. 



$ automake 

Makefile을 만드는데 필요한 Makefile.in 파일을 만들어 줍니다. 

automake명령어를 수행하게 되면 Makefile.am 파일을 참고해서 Makefile.in 파일을 생성해줍니다. 


Makefile.am은  프로그래머가 작성해 줘야 하는 파일로, 해당 프로젝트에 해당하는 정보를 기술해 주는 파일입니다. 

결과물로 생성될 실행 파일 이름을 뭐라고 할 지, 하위 디렉터리, 소스 파일, 사용할 라이브러리 정보 등을 써주셔야 합니다. 



bin_PROGRAMS = kthanUtil

SUBDIRS = tools

kthanUtil_SOURCES = parser.c util.c main.c


AM_CFLAGS = -Wall  -g


kthanUtil_LDADD =

kthanUtil_LDFLAGS= -lm -lpcre



위의 예제만 봐도 대충 어떻게 작성해줘야 하는지 감을 잡을 수 있을 겁니다. 

이 파일은 프로젝트의 모든 디렉터리 마다(include 폴더는 제외) 작성해 주어야 하며, 해당 경로에 소스코드가 없다면 'SUBDIRS'만 쓰면 됩니다. 


Makefile.am 파일의 문법에 대해 자세히 알고 싶으시다면 다음 링크를 참고하세요. 




만약, automake 과정에서 아래와 같은 에러가 발생하면.. 


configure.ac: no proper invocation of AM_INIT_AUTOMAKE was found.

configure.ac: You should verify that configure.ac invokes AM_INIT_AUTOMAKE,


configure.ac 에 아래처럼  'AM_INIT_AUTOMAKE'를 추가해 줘야 합니다. 


AM_INIT_AUTOMAKE(iwinfo, 1.0)



$ autoreconf 

automake 과정에서 config.h.in 파일이 없다고 아래와 같은 오류가 나오면 실행해 줍시다. 


configure.ac:7: required file `config.h.in' not found


그러면 config.h.in 파일이 생성됩니다. 



$ automake --add-missing

automake 에서 아래와 같이  'COPYING' 이 필요한데 없다고 에러가 나면 실행해 줍시다. 


Makefile.am: required file `./COPYING' not found

Makefile.am:   `automake --add-missing' can install `COPYING'


그러면, 'COPYING'와 같은 automake 에 필요한 디렉터리가 자동으로 생성됩니다. 



$ ./configure

autoconf로 생성한 configure를 실행 시킵니다. 

이 스크립트는 automake로 생성한 Makefile.in을 참고해서 Makefile을 만들어줍니다. (중간 과정에서 config.status 파일이 생성됩니다. )

이 과정까지 모두 오류없이 진행 하였다면 Makefile이 생성되어 있어야 합니다. 



$ make

위 과정에서 생성한 Makefile에 따라 빌드를 수행합니다.



$ make install

필요에 따라 빌드한 결과를 설치하면 됩니다. 



결과적으로 직접 만들어 줘야 하는 것은 Makefile.am 파일 하나 밖에 없구요. configure.ac는 조금 수정만 해주면 됩니다. 

과정이 조금 복잡해 보이기는 하지만 한 번 설정 해두면 복잡한 문법의  Makefile  대신 하위 디렉터리, 소스코드 이름 정도만 나열해 주면 되는 Makefile.am파일만 수정하면 되기 때문에 매우 편하게 작업을 할 수 있답니다. 



Posted by KT한
,

Django 어플리케이션을 Apache 서버에서 구동 시키기 위해 Debian 패키지를 만드는 방법입니다. 


이 글에서는 바이너리 패키지를 만드는 방법에 대한 설명만 하도록 하겠습니다. 


deb 패키징을 하려는 어플리케이션이  /home/USERNAME/Workspace/myapp 폴더라고 가정하고 진행하겠습니다.  (django 어플리케이션을 패키징 하는 것이므로 settings.py나 manage.py와 같은 파일들이 들어 있을 겁니다. ) 

myapp 이란 django 어플리케이션을 djangoapp이란 이름이로 패키지를 하는 절차입니다. 


작업을 진행하기 앞서 패키징을 진행할 위치에서 필요한 폴더를 만들고 작업하려는 파일들을 복사해 주어야 합니다. 

$ mkdir ./debian

$ mkdir -p ./debian/usr/share

$ mkdir -p ./debian/etc/init.d

$ mkdir -p ./debian/usr/share/doc/djangoapp

$ cp -r /home/USERNAME/Workspace/myapp ./debian/usr/share/


그 다음 패키징과 관련된 파일들을 넣어줄 'DEBIAN' 폴더도 만들어 줍시다. 


$ mkdir ./debian/DEBIAN



추천은 저를 춤추게 합니다 ^^



DEBIAN 폴더


이 폴더는 아래 파일들을 포함하고 있어야 합니다. 

  • control
  • config
  • conffiles
  • templates
  • postinst
  • postrm
  • preinst
  • prerm

각 파일들을 어떻게 작성해야 하는지 차례대로 알아봅시다. 


control 

이 파일은 패키징에 매우 중요한 파일입니다. 패키지에 대한 정보와 디펜던시(dependency)정보 등을 기술해줍니다. 우리는 바이너리(binary)패키지만 할 것이므로 아래와 같이만 기술해주면 됩니다. 


디펜던시(depends)에 이 패키지를 실행하기 위해 필요한 패키지 들을 나열해 주면 됩니다. 


config

패키지를 설치하기 전에 입력받아야 할 값이 있다면 이 파일에서 질문을 지정해주면 됩니다. 예를 들어 이름을 묻고 싶다면 아래와 같이 작성하세요. 


이 파일에는 질문에 대한 내용이 안보이죠? 그 내용은 아래 나오는 'templates'파일에서 기술하면 됩니다. 


templates

질문을 입력받기 위한 내용입니다. 일반적인 경우 입력 받을 일이 없으니 참고만 하세요. 


conffiles 

이 파일에는 패키지를 설치 할 때 일반적으로 '/etc' 하위 폴더에 넣어 줄 설정 파일과 관련된 정보를 기술해 줍니다. 우리는 django(장고) 시작 스크립트(script)apache(아파치) 설정 파일에 대한 정보를 입력해 주면 됩니다. 


아파치 설정 파일은 아파치 버전에 따라 다르겠지만,  버전 2.2.22 를 사용중인 저의 경우 'site-available'에 설정 파일을 넣어주고 'enable'시켜주는 방식이라 저 폴더에 넣어줬습니다. 


preinst

파일 이름에서 느낄 수 있는 것 처럼 설지를 진행하기 이전에 수행할 작업을 기술해 주는 파일 입니다. 


혹시나 이미 설치가 되어있어서 동작 중이었다면 동작을 중단 하도록 해줬습니다. 


postinst 

이 파일은 패키지를 압축을 푼 다음에 수행할 작업을 기술해 주는 파일입니다. 


설치시에 입력받았던 이름을 사용해서 무언가를 할 수 도 있습니다. 

그 외에도 필요한 폴더를 생성한다거나 다른 명령을 실행 하도록 지정 하는것도 가능합니다. 

( 'a2ensite'는 아파치의 'sites-available' 폴더에 넣어주었던 파일을 사용하도록 지정해 주는 명령어입니다.)


설치가 성공했다면 서비스를 시작하도록 해줍시다. 


prerm

이 패키지를 제거하는 명령어를 실행 했을 때 설치된 패키지를 제거하기 전에 수행할 작업을 기술해 주는 파일입니다. 


postrm

이 패키지를 제거하는 명령어를 실행 했을 때 설치된 패키지를 제거한 다음에 수행할 작업을 기술해 주는 파일입니다. 


여기까지가 'debian/DEBIAN'폴더에 넣어주어야 하는 파일들입니다. 



웹 서버(아파치) 설정

위에서 아파치 폴더의 'sites-available' 폴더에 넣어줬던 파일에 대한 설명입니다. 


호스트 이름, 포트 명과 같은 서버 설정 정보와 'root'폴더를 지정해줍니다. 

그 아래 정보들은 django(장고)를 apache(아파치)에서 구동되도록 하기 위한 설정 들입니다. 참고만 하세요. 



Django(장고) init.d 스크립트 

시작 스크립트는 './debian/etc/init.d' 폴더에 넣어주면 됩니다. 


저는 웹 페이지 경로를 '/var/www/' 로 지정해 주었습니다. 이를 위해서 '/usr/share/myapp' 폴더의 링크를 '/var/www/djangoapp/myapp'에 만들어 주어야 합니다. 

위의 'DEBIAN/postinst' 에 예제로 적어놓은것 처럼 'postinst'에 지정해 주셔도 됩니다. 



Debian doc 파일들 

해당 패키지에 대한 문서 파일들을 작성해 주어야 합니다. 


changelog (changelog.Debian) 

changelog는 2개의 파일이 필요하지만 초기 설치이므로 같은 내용으로 작성해줍시다. 


이 파일은 은근 문법을 따집니다. 빈 줄을 제거하지 마시고 잘 넣어보시고 그래도 잘 되지 않는다면 changelog 문서를 참고하세요. 

작성한 파일은 './debian/usr/share/doc/djangoapp/'폴더로 복사한 다음 'gz'파일로 압축해 줍니다. 


$ cp changelog changelog.Debian ./debian/usr/share/doc/djangoapp/

$ gzip --best ./debian/usr/share/doc/djangoapp/changelog


copyright

copyright정보를 기술해 주는 파일입니다. 


이 파일도 changelog와 동일하게 복사하고 'gz'파일로 만들어 줍니다. 


$ cp copyright ./debian/usr/share/doc/djangoapp/

$ gzip --best ./debian/usr/share/doc/djangoapp/changelog.Debian



패키지 빌드 실행 


debian은 파일의 권한(permission)을 755(-rwxr-xr-x)나 644(-rw-r--r--)로 할 것을 권장합니다. 

파일의 권한을 목적에 맞게 지정해 줍시다. 


$ find ./debian -type d | xargs chmod 755


이런 식으로 chmod 명령으로 파일 권한을 주시면 됩니다. 


준비를 다 했다면 패키지 빌드를 수행해 봅시다. 


$ fakeroot dpkg-deb --build debian

$ mv debian.deb djangoApp_1.0-1.deb

$ lintian djangoApp_1.0-1.deb


dpkg-deb 명령으로 빌드를 수행하고, 그 결과 생성된 파일을 원하는 이름으로 수정 한 다음 lintian명령으로 패키지에 문제가 없는지 검사하는 순서로 진행하시면 됩니다. 

lintian명령 수행 결과 맨 앞에 'W'로 표시된 'Warning'은 수정하는게 좋지만 수정하지 않아도 배포는 가능하고, 'E'로 표시되는 'Error'는 모두 수정하셔야만 됩니다. 

'Error'가 없다면 deb파일을 배포할 준비가 완료 된겁니다. 


참고한 글 

Posted by KT한
,

리눅스 장비에서 파일을 압축하거나 푸는 방법은 다양합니다. 

압축 방식별 장/단점과 사용법에 대해 알아봅시다.



1. ZIP

가장 일반적으로 사용되는 압축 확장자입니다.

장점: 거의 모든 OS환경에서 호환이 됩니다. 

단점: 최고 레벨의 압축을 지원하지 않습니다. (tar.gz이나 tar.bz2 보다 압축 레벨이 낮습니다.)


  • 압축 하기:

# zip -r FILENAME.zip FILENAME


  • 압축 풀기:

# unzip FILENAME



2. TAR

리눅스(Linux)환경에서 가장 일반적으로 사용됩니다.

장점: 압축에 소비되는 시간, CPU 가 적습니다.

단점: 압축이 거의 되지 않습니다. 주로 여러 파일을 하나의 파일로 묶는 용도로 사용됩니다. 


  • 압축 하기:

# tar -cf FILENAME.tar  FILENAME


  • 압축 풀기:

# tar -xf FILENAME.tar


  • 지정된 위치에 풀기:

# tar -xvf FILENAME.tar  -C  /tmp/dest_extract_path/ 



3. TAR.GZ

리눅스 환경에서 사용하기 가장 좋은 압축 옵션 중 하나 입니다.

장점: 압축률은 높은 편이지만, CPU는 많이 소비되지 않습니다.

단점: 최고 레벨의 압축을 지원하지 않습니다. 


  • 압축 하기:

tar -zcvf FILENAME.tar.gz FILENAME


  • 압축 풀기:

# tar -zxvf FILENAME.tar.gz


  • 지정된 위치에 풀기:

# tar -zxvf FILENAME.tar.gz -C /tmp/dest_extract_path/



4. TAR.BZ2

리눅스 환경에서 사용하기 가장 적합한 압축 옵션 중 하나 입니다.

장점: 최고의 압축률을 자랑합니다.

단점: 시간과 CPU사용률이 적지 않습니다. 


  • 압축 하기:

# tar -jcvf FILENAME.tar.bz2 FILENAME


  • 압축 풀기:

# tar -jxvf FILENAME.tar.bz2


  • 지정된 위치에 풀기:

# tar -jxvf FILENAME.tar.bz2 -C /tmp/dest_extract_path/



추천은 저를 춤추게 합니다 ^^



  • 요약 정리 


확장자  압축  압축 풀기 

비고 

 .zip

 zip -r FILENAME.zip FILENAME

 unzip FILENAME

 'r' 옵션은 하위 폴더까지 모두 압축 하도록 함.

 .gz

 gzip FILENAME

 gzip -d FILENAME.gz
 gunzip FILENAME.gz


 .bz2

 bzip2 -k FILENAME

 bzip2 -dk FILENAME.bz2

 bunzip2 -k FILENAME.bz2

 'k' 옵션으로 입력 파일을 삭제하지 못하게 함.

 .tar

 tar -cvf FILENAME.tar  FILENAME

 tar -xvf FILENAME.tar

 'v' 옵션으로 실행 과정 출력

 .tar.gz

 tar -zcvf FILENAME.tar.gz FILENAME

 tar -zxvf FILENAME.tar.gz

 'z' 옵션이 gz 파일 압축풀기 옵션

 .tar.bz2

 tar -jcvf FILENAME.tar.bz2 FILENAME

 tar -jxvf FILENAME.tar.bz2

 'j' 옵션이 bz2 파일 압축풀기 옵션 


Posted by KT한
,


RPM (Red Hat Package Manager)은 리눅스에 사용되는 가장 일반적인 소프트웨어 패키지 방법입니다. 

Debian에서 사용하는 deb방식도 있지만 일반적으로 rpm으로 패키징 되어 배포되고 있습니다. 


rpm을 만드는 내용은 .spec 파일에 정의해 주면 됩니다. 

spec파일은 vim 에디터로 name.spec 과 같이 임의의 파일을 생성하면 자동으로 기본 탬플릿을 채워줍니다. 




rpmbuild 명령어로 spec파일을 인자로 주어 실행하게 되면 패키징을 수행합니다. 


$ rpmbuild -bb name.spec


spec파일에는 수행해야할 명령들이 정의해줘야 합니다. (위에 접혀 있는 'spec 파일 탬플릿 열기'를 펼쳐 보세요.)




spec 파일의 각 파트별 역할에 대해 알아봅시다. 


Preamble(서문)


● Source


RPM을 만들기 위해 사용할 압축 파일(.tar.gz) 지정 해 줄 수 있습니다. 

Source 뒤에 숫자를 붙여 여러 소스파일을 지정 해 줄 수 있습니다. 숫자는 '0' 부터 시작해야 합니다. 


Source0: myrpm.tar.gz



● Requires


이 rpm이 built(설치)되기 이전에 설치 되어 있어야 할 rpm을 지정해줄 수 있습니다. 

기본적으로 이름만 써도 되지만, 버전을 체크 하도록 할 수 있습니다. 

비교 연산자는 ( <, >, =, >=,  <=) 를 지원합니다. 

Requires: gcc >= 4.4.4 


만약 64bit 머신에 32bit rpm을 설치해야 할 일이 있는경우 해당 정보를 지정해 주어야 합니다. 

아래 처럼 괄호안에 지정해 주면 됩니다. 


Requires: libedit(x86-32)

 

 

● BuildRequires 

이 rpm을 build 하기 위해 필요한 rpm을 지정해 줄 수 있습니다.  

빌드에 필요한 rpm이므로 주로 devel 패키지가 될 겁니다. 


BuildRequires: libpcap-devel




- Scriptlets 


실제로 수행할 명령을 지정해주는 섹션으로 bash shell 명령어를 지원합니다. 



● %prep 

Source0에서 지정한 파일을 빌드를 하기 위해 필요한 일들을 지정해 줍니다. 압축을 푸는 작업이 주된 작업이 됩니다.  


-q 옵션을 사용하면 압축을 푸는 과정을 보여주지 않습니다. 진행 과정을 감춘다고 생각하면 됩니다. 

-n 옵션으로는 이름을 지정해 줄 수 있습니다. 


%prep

%setup -q -n myrpm 



● %build

'%prep' 다음에 수행되며, 압축을 푼 소스를 가지고 빌드를 수행합니다. 


주로 './configure'를 실행하여 'Makefile'을 생성하고, 'make'를 수행하여 빌드를 수행합니다. 



● %install

'%build' 다음에 수행되며, 빌드 수행결과 생성된 파일들을 설치 폴더로 복사하는 역할을 수행합니다. 


주로, 'make install'을 수행해서 실행 파일들을 '~/rpmbuild/BUILDROOT' 폴더 아래로 넣는 작업을 수행합니다. 

물론, Makefile에 make install시 수행할 동작에 대해 미리 정의해 주어야 합니다. 

일반적으로 빌드를 통해 생성된 실행 파일을 특정 경로에 넣어주는 작업을 설정해주게 됩니다. 


아래는 'mybin' 이란 파일을 지정한 경로에 설치 하기 위한 Makefile 예제입니다. 


Makefile

install:

test  -z  "$(INSTALLDIR)/"  ||  mkdir  -p  "$(INSTALLDIR)"

install  -m  644  mybin  $(INSTALLDIR)/



물론, Makefile에는 값에 대한 정의가 되어 있어야 겠죠. 


Makefile

INSTALLDIR=$(shell pwd)/myinstall



만약 path를 Makefile에 넘겨줘야 할 상황이 발생하게 되면 아래와 같은 방식으로 지정해 줄 수 있습니다. 


.spec 

%install

make INSTALLDIR=$RPM_BUILD_ROOT install



● %check 


'%install' 다음에 수행되며, 설치 이후에 테스트 케이스 검증같은 작업을 위해 사용합니다. TDD기반의 프로젝트라면 이 위치에 테스트를 수행하도록 설정해주면 됩니다. 



● %clean


빌드 마지막에 수행합니다. 빌드 과정에서 생긴 파일들을 지우도록 설정 할 수 있으며, 주로 설치 폴더를 삭제하도록 설정해줍니다. 

spec파일 기본 탬플릿에 있는 내용을 그대로 사용하시면 됩니다. 



● %files 


rpm 파일에 묶여야(패키징) 하는 파일의 이름을 지정해주게 됩니다. 물론, 폴더 이름을 지정 해주는 것도 가능한데, 하위 폴더를 포함 한 모든 파일을 모두 묶는 의미로 사용됩니다. 

여기서 지정한 파일만 rpm 파일에 묶이게 된다고 생각하면 됩니다. 


파일 리스트를 파일로 입력 받는것도 가능합니다. 


%files -f myfile.list 



패키징 될 파일의 경로(path)정보는 Makefile에서 사용한 값을 사용하게 됩니다. 

다시 말해서.. Makefile에서 install 한 경로 정보와 동일한 값으로 spec 파일에 지정해 주어야 하는 것입니다. 


물론, automake와 같은 툴을 사용한다면 크게 신경쓰지 않아도 되는 부분이기는 하나, Makefile을 직접 만들었다면 절대 경로가 아닌 상대 경로에 설치 하도록 해주어야만 rpmbuild 수행 시 ~/rpmbuild/BUILDROOT/ 아래 설치 하는게 성공 할 수 있습니다. 



파일 리스트 앞에는 Prefix가 붙을 수 있으며, 각각의 의미는 다음과 같습니다. 


◆  [기본] - 아무런 Prefix가 없음 

데이터 파일이라고 생각해서 항상 엎어쓰고 rpm 삭제시에는 제거해줍니다. 혹시 기존에 설치 되었던 파일을 수정했었다 하더라도 신경쓰지 않습니다. 


◆  %config

기존에 설치 된 파일이 수정되었다면 기존 파일을 '.rpmsave' 확장자를 붙여서 백업해놓고 새로운 파일을 설치합니다. 설치 이후에 파일이 수정되었다면 변경된 설정 값을 지우지 않고 백업해 준다는 의미입니다. 


◆  %config(noreplace)

기존에 설치 된 파일이 수정되었다면 기존 파일을 유지하고, 새로 설치될 파일을'.rpmsave' 확장자를 붙여서 설치합니다. 설치 이후에 파일이 수정되었다면 수정된 설정 값을 유지 시키기 위해 사용합니다. 


 옵션 이름

RPM에 포함된 파일 수정?

설치된 파일 편집 안됨 

설치된 파일 편집 됨 

 [기본]

No 

RPM으로 부터 설치 

RPM으로 부터 설치 

 Yes

RPM으로 부터 설치 

RPM으로 부터 설치 

%config 

No 

RPM으로 부터 설치 

기존 파일 유지 

Yes 

RPM으로 부터 설치 

RPM으로 부터 설치 기존 파일은 .rpmsave로 이름수정 

%config(noreplace) 

No 

RPM으로 부터 설치 

기존 파일 유지 

Yes 

RPM으로 부터 설치 

기존 파일 유지. RPM에서 받아온 파일은 .rpmnew로 저장. 



◆  %attr 

설치된 rpm 권한과 소유권을 지정해 줄 수 있습니다. 


%attr (<mode>, <user>, <group>) filename 


예) %attr (600, root, -) /etc/mybin



◆  %defattr 

기본 권한 값을 설정 해 줄 수 있습니다. 


%deattr(<file mode>, <user>, <group>, <dir mode>)


예) %defattr(644, root, root, -)



◆  %dir

패키지에 포함시킬 폴더를 지정해줘서 생성하도록 합니다. 주로 특정 위치에 빈 폴더를 생성 시키기 위해 사용합니다. 




● %package


서브-패키지를 생성하기 위해 사용합니다. 이름은 당연히 'Name' 필드에 지정해준 이름을 사용하며 여기서 지정해준 이름을 이어서 패키지 이름을 지어주게 됩니다. 


Name은 'foo' 이고 '%package bar' 라고 지정하게 된다면 'foo-bar.rpm' 이란 이름의 rpm 파일이 생성될겁니다. (물론 뒤에 버전 정보 같은것도 들어가겠죠.) 


release 번호는 메인-패키지와 별도로 지정이 가능합니다. 



%if - %else - %endif

빌드 환경을 체크해서 환경에 따라 다르게 동작하게 할 수 있습니다. 


%if 의 종류는... 

아키텍쳐(architecture)를 검사하는 %ifarch 와 %ifnarch가 있습니다.  (i386, alpha, sparc, etc.. )

운영체제(operating system)을 검사하는 %ifos 와 %ifnos가 있습니다.  (linux, etc... )


%else와 %endif는 %if와 짝으로 사용하면 됩니다. 이름만으로 어떻게 동작하시는지 아실겁니다. 


%ifarch i386

make RPM_OPT_FLAGS="$RPM_OPT_FLAGS -I ."

%else

make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"

%endif




● %post


 rpm 설치 이후에 뭔가 추가 작업을 해줘야 할때 사용합니다. 

예를 들면.. 설정 파일에서 값을 변경하거나.. chkconfig 와 같은 작업 지정이 가능합니다. 





※ 참고로 rpmbuild시 path 정보는 rpmmacros 파일에 정의해주면 됩니다. 


$ vi ~/.rpmmacros


%_topdir /home/kyungtae/rpmdir

%_builddir %{_topdir}/BUILD

%_rpmdir %{_topdir}/RPMS

%_sourcedir %{_topdir}/SOURCES

%_specdir %{_topdir}/SPECS

%_srcrpmdir %{_topdir}/SRPMS


물론, BUILD, RPMS, SOURCES, SPECS, SRPMS 폴더는 미리 만들어 줘야 합니다. 



참고 링크 : 

http://www.rpm.org/max-rpm-snapshot/ch-rpm-specref.html


Posted by KT한
,

내가 만든rpm에 서명을 넣는 방법에 대해 알아봅시다. 


우선 rpm에 서명(signature)를 넣는 방법은 크게 두 가지가 있을 수 있습니다. 


  1. rpm 빌드 할 때 서명을 넣는 방법
  2. rpm 생성을 완료한 후 서명을 넣는 방법


저는 젠킨스(Jenkins)라는 CI(Continuous Integration)를 사용하고 있기 때문에, 젠킨스를 통해 rpm 생성 시점에서 서명을 넣는 방법을 택하였습니다. 


수행 절차:


1. 서명 만들기 


gpg 명령어를 써서 서명을 만들어봅시다. 

$ gpg --gen-key 


서명을 만드는 절차를 모두 보고 싶다면.. 


키 생성은 DSA로 하였으며, 키 길이는 1024로 해줬습니다. 

'Real name'에 입력한 값은 꼭 기억해 둬야 합니다. 


2. rpm 만들때 서명 넣기 


  • 서명 넣기 

$ rpm --addsign -D '_signature gpg' -D '_gpg_name Realname' -D '_gpg_path ~/.gnupg/'  sign_to_this.rpm"

Enter pass phrase: *****

Pass phrase is good.


  • 입력 값 
  1. 서명 타입( _signature - gpg로 생성했으므로 gpg
  2. 서명 이름( _gpg_name ) - 서명을 만들 때 'Real name'에 입력했던 이름
  3. 서명 경로( _gpg_path ) - 일반적으로 'home'경로의 '.gnupg' 폴더에 생성됨
  4. 서명을 넣고자 하는 rpm 경로 및 이름  


  • 통합 관리  

/home/.rpmmacros 파일에 위 정보들을 넣어두면 매번 수동으로 입력해주지 않아도 됩니다. 


%_signature gpg

%_gpg_path ~/.gnupg

%_gpg_name UserName (Example GPG Key Signature For RPM Packages) <user@signature.com>

%_gpgbin /usr/bin/gpg                              <- which gpg로 확인 가능 




3. rpm에 넣은 서명 확인 


$ rpm --checksig <rpm_name> 

혹은 -K 옵션도 동일 


예) $ rpmsign -K my_signed.x86_64.rpm

my_signed.x86_64.rpm: (SHA1) DSA sha1 md5 (GPG)



4. yum으로 서명이 들어간 rpm 설치하기  


먼저 KEY파일을 rpm을 설치하는 장비에 옮겨놔야합니다. 

/etc/pki/rpm-gpg 폴더에 fedora에서 사용하는 key파일이 있으므로 이곳으로 옮겨줍니다. 


그 다음.. 

/etc/yum.repos.d/<name>.repo  파일을 열어서 다음 옵션을 사용해서 설치할 rpm의 서명을 확인 하도록 'gpgcheck'값을 1로 변경해줍니다. 

물론, gpgkey 경로도 설정해줘야 하구요. 


gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/Username-GPG-KEY



5. 서명 자동화 

위 작업을 빌드 자동화 시스템에 추가하고자 한다면 매번 수동으로 서명을 넣는 것은 미친 짓일겁니다. 
이제 반복잡업을 군소리 없이 잘 해주는 컴퓨터에게 매번 알아서 하도록 시켜줘야겠죠?

자동화 작업의 최대 난관은 서명을 추가할 때 마다 비밀번호를 입력 받는다는 것입니다. 
비밀번호를 요구할 때 자동으로 지정해준 비밀번호를 넣어주도록 해줘야 하는데 이를 위해 expect를 사용하기로 했습니다. 

조인씨 사이트에 나온 설명을 인용하자면..  

expect 를 이용하면 다른 어플리케이션과 상호대화를 할수 있게 됨으로 자동화된 프로그램을 만들수가 있다. 



expect에 대한 설명 뿐 아니라 perl을 사용해서 자동화 프로그램을 작성하는 법 및 예문까지 친절하게 나와있답니다. 


참고로, 위 작업을 위해서는 expect와 perl-Expect를 설치해주셔야 합니다. 

$ yum install perl-Expect

Downloading Packages:
(1/2): perl-Expect-1.21-3.fc12.noarch.rpm                                                                           |  70 kB     00:00
(2/2): perl-IO-Tty-1.08-3.fc12.x86_64.rpm                                                                             |  39 kB     00:00
-------------------------------------------------------------------------------------------------------------

$ yum install expect 

Downloading Packages:
(1/2): expect-5.43.0-19.fc12.x86_64.rpm                                                                                  | 238 kB     00:00
(2/2): tcl-8.5.7-5.fc12.x86_64.rpm                                                                                           | 1.9 MB     00:00
-------------------------------------------------------------------------------------------------------------                                                                                                  


스크립트는 다음만 조심해서 작성하면 됩니다. 

  •  spawn() 함수 
상호대화할 프로그램을 띄우기 위한 목적으로 사용됩니다. 여기서는 rpm 으로 서명을 넣는 명령을 정의해 주면 됩니다. 

예)
my $exp = Expect->spawn("rpm --addsign -D '_signature gpg' -D '_gpg_name UserName' -D '_gpg_path ~/.gnupg/' sign_to_this.rpm");

  • expect() 함수
특정한 문자열을 기다리고, 해당 문자열을 발견하게 되면, 어떤 행동을 취할수 있도록 인터페이스를 제공해줍니다. 
여기서는 서명에 대한 비밀번호 입력 요청을 기다리게 됩니다.  

예)
$exp->expect($timeout,
    [qr 'Enter pass phrase:' => \&inputpassphrase],);

sub inputpassphrase
{
    my $lexp = shift;
    $lexp->send("mypassword\n");
    exp_continue;
}

  • send()함수 
원하는 문자열을 전달합니다. 위의 예제를 보시면 알 수 있듯 비밀번호를 전송하게 됩니다. 

예)
$lexp->send("mypassword\n");


6. 검증 

이제 자동화 스크립트에 의해 서명이 들어간 rpm이 제대로 설치 되는지만 확인해보면 된답니다. 
Posted by KT한
,

소스 검증 툴은 크게 정적 분석 툴(static analysis tool)과 동적 분석 툴(dynamic analysis tool)로 구분 할 수 있습니다. 


정적 분석 툴은 분석하고자 하는 프로그램을 실행시키지 않더라도 소스만 보고 문제를 찾아준다는 장점이 있지만, 

아무래도 복잡한 소스는 문제를 완벽하게 찾아주지 못한다는 단점이 있습니다. 

대표적으로 Prevent(유료)가 있습니다. 

다양한 정적 분석 툴(http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis)


동적 분석 툴은 메모리에 관한 거의 모든 문제를 찾아준다는 정확성면에서 매우 큰 장점이 있지만,

프로그램을 실행 시켜야만 된다는 단점이 있습니다. 

(프로그램이 매우 크다거나.. 종료되지 않고 계속 도는 데몬이라면.. 분석이 어려울 수 있습니다. )

Valgrind(무료)는 대표적인 동적 분석 툴에 해당됩니다. 

동적 메모리 디버깅 툴: MEMWATCH, Valgrind, Electric Fence, etc..

그 외의 다양한 동적 분석 툴(http://en.wikipedia.org/wiki/Dynamic_code_analysis)



프로그래밍을 하다보면 메모리 누수(memory leak)를 찾지 못해 고생하는 일이 종종 발생하죠. 

소스를 보기가 막막하다면 Valgrind(발그린드)의 도움을 받아보는것이 정신건강에 좋습니다. 


자세한 설명은 메뉴얼을 참고하세요~ 

valgrind_manual.pdf



추천은 저를 춤추게 합니다 ^^



1. 설치 


기본적으로 fedora와 같은 linux에는 valgrind 패키지가 포함되어 있습니다. 

yum 명령어를 사용해서 손쉽게 설치가 가능합니다. 

$ yum install valgrind 



2. 실행


기본적으로 제공되는 도움말에 다음처럼 사용법을 제시하고 있습니다. 

usage: valgrind [options] <prog-and-args>


예를 들면 이런식으로 실행 하는거죠.

$ valgrind --leak-check=full ./testLeak 



3. 결과 분석 


malloc 후에 free를 하지 않은 프로그램을 돌려보면 이런식으로 결과가 나옵니다. 


1) process ID(28403)가 앞에 나옵니다. 

2) 명확하게 leak이 발생한 크기(4bytes)에 대한 정보가 첫 줄에 나옵니다. 

3) 'at'은 leak이 발생한 위치, 즉 malloc에 의해 메모리를 할당 했는데 free가 안됐다는걸 보여줍니다. 

4) 'by'는 leak이 발생한 함수 이름이 나오죠. 


$ valgrind --leak-check=full -q  ./testLeak

==28403== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1

==28403==    at 0x4A0515D: malloc (vg_replace_malloc.c:195)

==28403==    by 0x40056D: main (in /testLeak)

==28403==



4. 팁


옵션을 좀 더 살펴보면.. 

1) tool을 선택 가능합니다. 

--tool=memcheck 와 같이 지정해주면 됩니다. 

사실, 기본으로 [memcheck]가 선택되어 있기때문에 memcheck를 할꺼라면 별도로 지정해주지 않으셔도 됩니다. 


선택가능한 옵션은 이런것들이 있답니다. 

memcheck(memory), cachegrind(cache), callgrind(call-graph), helgrind(thread), etc..



2) 결과만 보고 싶다면 

-q 옵션을 붙여주면, 잡다한 메시지는 보여주지 않고 에러 메시지만 출력합니다. 


Posted by KT한
,

삼바(Samba)는?

삼바는 윈도우를 설치한 PC에서 리눅스(유닉스) 서버에 있는 파일을 공유할 수 있게 해줍니다. 

즉, 윈도우 사용자가 리눅스 장비의 삼바 서버에 접속한 후, 윈도우용 에디터를 이용하여 파일을 편집 하는게 가능하도록 해준다는 거죠. 



1. 삼바 설치


# yum install samba 


=============================================================================

 Package                  Arch      Version           Repository        Size

=============================================================================

Installing:

 samba                    x86_64    3.4.9-60.fc12     secui-updates    4.3 M

Installing for dependencies:

 libtalloc                x86_64    2.0.0-0.fc12      secui-mirror      19 k

 samba-common             x86_64    3.4.9-60.fc12     secui-updates     11 M

 samba-winbind-clients    x86_64    3.4.9-60.fc12     secui-updates    934 k


Transaction Summary

=============================================================================

Install       4 Package(s)

Upgrade       0 Package(s)



2. 삼바 설정 

설정 파일을 열어서 설정 가능 


# vi /etc/samba/smb.conf 


기본적으로 'homes'가 공유되도록 되어 있음. 

삼바를 설치 한 장비에 유저로 등록 되어 있다면 자신의 'home' 디렉터리를 접근 할 수 있도록 해준다는 뜻. 

만약, public을 설정 하고 싶다면 설정 파일 하단에  'public'을 검색해서 주석을 해제하면 됩니다. 


[homes]

        comment = Home Directories

        browseable = no

        writable = yes



3. 삼바 시작 

yum을 통해서 설치 했다면 간단하게 아래 명령어만 실행 해주면 됩니다. 

'OK' 라고 나오면 정상적으로 시작 된겁니다. 


# service smb start

Starting SMB services:                                     [  OK  ]


장비가 꺼졌다가 켜졌을 때 자동으로 시작하게 하려면 chkconfig에 등록 해야 합니다. 

우선 현재 상황을 확인합니다. 


# chkconfig | grep smb

smb             0:off   1:off   2:off   3:off   4:off   5:off   6:off


아래 명령어를 수행해서 삼바를 등록해줍니다. 


# chkconfig smb on


이후 다시 확인하면 정상적으로 등록 되어있겠죠? 


# chkconfig | grep smb

smb             0:off   1:off   2:on    3:on    4:on    5:on    6:off



4. 사용자 등록 

이제 삼바 사용자를 등록해주면 됩니다. 

아래 명령어를 실행해주면 됩니다. 


# smbpasswd -a kthan


New SMB password:

Retype new SMB password:

Added user kthan.



5. 삼바 접근하기 

윈도우 탐색기를 열어서 삼바를 설정한 서버주소를 입력해 보세요. 
사용자 정보를 입력 하면 'home' 폴더의 정보가 보일겁니다. 



Posted by KT한
,

먼저 젠킨스(허드슨)를 설치 하셨다는 가정하에 설명을 시작하겠습니다. 

젠킨스(Jenkins)와 허드슨(Hudson)은 이름만 바뀌었을 뿐 설정 및 기능은 거의 같습니다. 

만약 아직 설치 하지 않으셨다면 이전 포스팅을 참고하세요~ 


소스 자동 빌드 시스템 - 젠킨스(허드슨) 설치


Xcode와 같은 프로젝트에 활용하는 방법은 다음 포스팅을 참고하세요

소스 자동 빌드 시스템 - 젠킨스(허드슨) 플러그인 기능 활용 


추천은 저를 춤추게 합니다 ^^


1. 젠킨스 메인 페이지에 접속해봅시다

기본값은 서버 주소에 8080 포트로 접속하면 됩니다. (예: http://192.168.10.10:8080) 


2. 왼쪽 메뉴에서 "Manage Jenkins"를 선택합니다. 

 설정 메뉴가 나오면, "configure system"을 선택합니다. 

시스템의 기본 설정을 하기 위해서죠. 


3. 가장 먼저 작업 갯수를 설정 합니다. 

①에 있는 실행 갯수 만큼 좌측 메뉴에 작업 수가 늘어납니다. 

② enable security를 체크하면 유저 별로 권한 설정이 가능합니다. 

편의상 로그인한 유저라면 모든 설정이 가능하도록 했습니다. 


4. 좀 더 스크롤을 내려봅시다. 

요즘은 소스 관리에 주로 svn을 사용하죠.. 

① 버전이 기본은 1.4로 되어 있는걸 1.6으로 변경해줍니다. 

② 빌드가 깨졌을 때 연관된 사람들에게 메일을 보내주는 기능이 있습니다. 

신속한 대응을 위해서 유용하니 메일을 보낼 사람의 계정 정보를 넣어줍니다. 

(메일 수신인은 프로젝트 설정에서 합니다.)

설정이 끝났다면 저장합니다. 


5. 이제 프로젝트를 생성해봅시다. 

① New Job 을 클릭해봅시다. 

② 이름을 설정해주고..

③ 제일 무난한 free-style 프로젝트를 선택합니다. 

④ 만약 기존에 설정했던 설정을 템플릿 처럼 쓰고 싶다면 맨 아래 'copy existing job'을 선택하면 됩니다. 

입력 필드에 기존에 생성한 job 이름을 입력해줍시다. 

자동완성 기능을 지원하므로, 기존에 생성한 job 이름의 첫 글자만 기억하고 있으면 됩니다. 

(한글화 화면 - 브라우져의 언어에 따라 자동으로 선택됨)


6. 생성하면 자동으로 설정화면으로 넘어갑니다. 

① svn 정보를 넣어줍니다. 

② 최신 소스를 어떻게 관리할지 선택합니다. 

특별한 문제가 없다면 'svn update'를 하면 됩니다. 

하지만, 가끔 소스가 꼬이면 'Always check out a fresh copy'를 선택하면 기존 소스를 지우고

새로 받아서 다시 빌드를 시도합니다. 

알아두면 유용합니다. 

③ 만약 svn서버에 권한이 필요하다면 'enter credential' 링크를 클릭합니다. 

7. 위에서 자격 증명하기를 클릭하셨다면 이런 화면이 나옵니다. 

계정 정보와 비번을 입력해주면 됩니다. 


8. 좀 더 화면을 아래로 내려봅시다. 

① 주기적으로 소스를 가져다가 빌드를 수행하게 하려면 설정해줍니다. 

crontab을 생각하면 이해가 쉬울겁니다. 

② 빌드 단계를 추가해줍시다. 

③ 'Execute shell'을 선택하면 command를 입력할 수 있는 창이 뜨게 되고, 

순차적으로 진행할 명령들을 입력해줍니다. 

(명령창은 복수 개 등록 가능합니다. )

④ 빌드 성공 후 생성된 파일들을 어떻게 할지 설정해줍니다.  

⑤ 만약 빌드에 실패했을 때 담당자(개발자 혹은 QA-검증자)들에게 메일을 보내기 위해 사용합니다. 

수신인 메일 주소를 넣어주면 됩니다. 

⑥ 만약 컴파일을 실패할 때 마다 메일을 보내고 싶다면 체크해줍니다. 

빌드가 깨졌는데 이를 복구하지 못한 상태에서 

다른 사람들이 계속 소스 커밋을 하게 되면 폭탄메일을 받을 수 있으니 참고하세요. 

⑦ 빌드를 깨먹은 사람한테만 메일을 보내려면 이 옵션을 체크합니다. 

단, 메일 리스트에 입력해둔 사용자에게 보내는것과 별개로 동작하는 옵션입니다. 

메일 리스트에 아무도 입력하지 않고, 이 옵션만 체크해야만.. 

빌드가 깨졌을 때 실제로 소스를 커밋한 사람한테만 메일을 전송합니다. 


9. 사용자 계정 관리  

사용자 계정은 한가지만 조심하시면 됩니다. 

svn에 소스를 커밋한 계정을 보고 젠킨스가 자동으로 사용자 계정을 만들어 둡니다. 

때문에, svn과 동일한 계정으로 ID를 만들려고 하면 이미 존재하는 ID라고 오류가 발생하죠. 

이때는 관리자 계정으로 해당 계정의 설정 메뉴를 클릭하면 비번을 설정 할 수 있답니다. 


10. 이제 아래처럼 항상 햇님이 반짝 떠 있도록 관리만 잘 하시면 됩니다. 

① 특정한 순간에 수동으로 빌드를 시작하고 싶다면 '빌드 시작' 버튼을 누르면 됩니다. 

나머지 소소한 기능들은 차차 사용하면서 알아가면 될겁니다. ^^ 



※ 이 외에 세부설정은 hudson book을 참고하세요. 

book-hudson.pdf


  • 유용한 플러그인 배워보기

[프로그래밍] 젠킨스(Jenkins) 플러그인 활용 - Groovy Postbuild


Posted by KT한
,

지속적 통합관리(CI - Continuous Integration툴인 

젠킨스(구:허드슨)을 설치하는 방법에 대해 설명 드리겠습니다. 


2011년에 허드슨(Hudson)이 젠킨스(Jenkins)로 이름을 바꾸게 되었는데요. 

이는 오라클에서 Hudson이란 상표를 가지고 있어서 바뀌었다고 합니다. 


하지만, 이름만 바뀌었을 뿐 기능은 지속적으로 유지 및 향상 되어가고 있답니다. 

프로젝트의 안정적인 유지 관리를 위해서라도 이번 기회에 최신 버전으로 갈아타는것도 괜찮겠죠? 



※ 참고로 Fedora12에서 설치하였습니다.  



젠킨스 설정 방법에 대한 내용은 다음 포스팅을 참고하세요. 

소스 자동 빌드 관리 툴 - 젠킨스(허드슨) 설정 

추천은 저를 춤추게 합니다 ^^



1. 젠킨스(Jenkins) 다운 및 설치


- 향후 젠킨스(Jenkins)를 패치할 상황을 대비해서.. 

조금 번거롭더라도 yu리포지터리(repository)를 추가해 주도록 합니다. 


(YUM에 대해서 잘 모르시는 분은.. 온라인 업데이트 정도로 생각하시면 될것 같네요. )


# wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
# rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key


- 정상적으로 추가했다면 yum으로 젠킨스를 설치합니다. 


# yum install jenkins


- 만약 젠킨스의 업데이트 정보를 정상적으로 받아오지 못한다면,  yum db를 한번 지워주세요. 


# yum clean all && yum install jenkins


-정상적으로 설치 되었는지 확인해봅니다.  


#  rpm -qa | grep jenkins
jenkins-1.457-1.1.noarch



2. 젠킨스를 실행하기 위해 필요한 java 설치


- 역시 yum으로 설치 해줍니다. 

(한번에 정상적으로 설치가 안되는 경우가 있습니다.  이럴 때는 한 번 더 실행해 줍니다. )


# yum install java


- 다음과 같은 파일들이 설치 되어야 합니다. 


Installed:

  java-1.5.0-gcj.x86_64 0:1.5.0.0-29.fc12 

  java-1.6.0-openjdk.x86_64 1:1.6.0.0-43.1.8.3.fc12


Dependency Installed:

  gmp.x86_64 0:4.3.1-5.fc12  java_cup.noarch 1:0.11a-1.fc12  jpackage-utils.noarch 0:1.7.5-3.8.fc12  

  libgcj.x86_64 0:4.4.4-10.fc12    sinjdoc.x86_64 0:0.5-9.fc12giflib.x86_64 0:4.1.6-3.fc12  

  jline.noarch 0:0.9.94-0.6.fc12  rhino.noarch 0:1.7-0.7.r2.fc12   tzdata-java.noarch 0:2010o-1.fc12  



3. 실행하기


- 정상적으로 설치 됐다면 간단하게 실행 가능합니다.


# service jenkins start


- 실행 결과:


Starting Jenkins                                           [  OK  ]




4. 접속하기


- 브라우져의 주소창에 서버 주소와 기본포트인 8080을 입력합니다. 


http://server주소:8080/


- 정상적으로 실행 된다면 이런 화면이 뜨게 됩니다. 

짜릿한 기분을 느낄 수 있는 순간이기도 하죠. ^ㅡ^




5. 잘 활용하기 


- 이제, 관리해야할 subversion 정보를 등록하고 자동으로 빌드를 수행하도록 하면 됩니다. 


  • 유용한 플러그인 배워보기

[프로그래밍] 젠킨스(Jenkins) 플러그인 활용 - Groovy Postbuild




Posted by KT한
,

gdb 사용에 관한 기본적인 내용은 다음 포스트를 참고하세요.
http://kthan.tistory.com/6

명령어의 일부를 빨간색으로 표시한건 단축키를 의미합니다. 



1. 브레이크포인트 설정 명령어

1.1 break : 특정 위치에 브레이크 포인트 설정


예) break func : func 함수의 시작위치에 설정
     break 123   : 123번째 줄에 설정
     break main.c:func  : main.c 파일의 func 함수의 시작 위치에 설정
     break 123 if i == 1  : i값이 1 일때 123번째 줄에 설정


1.2 rbreak :정규표현식(regular expression)을 사용해 여러 심볼에 브레이크포인트 설정


예) rbreak ^func : fun로 시작하는 모든 심볼에 설정
     rbreak func : func를 포함하는 모든 심볼에 설정


1.3 clear :특정 브레이크포인트 지우기 

     예) clear func : func 함수에 설정한 브레이크포인트 지움
          clear 123  : 123번째 줄에 설정한 브레이크포인트 지움


1.4 info breakpoints: 설정한 브레이크포인트 정보 조회


1.5 enable/disable breakpoints :특정 브레이크 포인트 활성화/비활성화 


예) disable breakpoints : 모든  브레이크포인트 비활성화

     disable breakpoints 1,2,5 : 1,2,5번 브레이크 포인트 비활성화 (info b로 조회한 브레이크포인트 숫자)

     enable breakpoints : 모든  브레이크포인트 활성화

     enable breakpoints 1,2,5 : 1,2,5번 브레이크 포인트 활성화 


1.6 delete :설정한 모든 브레이크포인트를 지움



2. 값 출력 

2.1. info 명령어

info <출력할 타입>: 특정 타입의 info 정보를 출력.
(gdb에서 info를 입력하고 Tab키를 누르면 조회 가능한 모든 값들을 볼 수 있음. )


예) info locals : 지역 변수와 값 출력 
     info variables : 전역 변수와 값 출력
     info registers : 레지스터의 값 출력
     info frame: 스택 프레임 정보 출력
     info thread: 스레드별 정보 출력 


2.2. print 명령어

print/[출력 형식] (형 변환)[변수] : 특정 변수 값을 원하는 포맷으로 출력 

  • 출력 형식:
    t: 2진수
    o: 8진수
    d: int형 10진수
    u: unsigned int형 10진수
    x: 16진수
    c: 1 바이트를 char형
    f: float형 

예) print/x lval : lval를 16진수로 출력 
     print (char *) str : str변수를 "char *" 타입으로 변환 후 출력           


  • 다양한 값 지정 

예) print array@12   : 크기가 12인 array라는 배열을 출력           
    print func::value  : func라는 함수에 있는 value라는 변수 출력 


2.3. list 명령어
list  : 소스 리스트 출력  

예) list    : 현재 실행중인 위치 주변의 소스 출력 
     list func : func 함수의 주변의 소스 출력  
     list 199 : 199 라인 주변의 소스 출력  
     list main.c:main  :  main.c 함수의 main함수 주변의 소스 출력  
     list main.c:199    : main.c 함수의 199 라인 주변의 소스 출력   

  • 보여지는 라인 수 설정 
  예) (gdb) set listsize 20 : list 명령어로 보여지는 라인수를 20줄로 변경



2.4 display 명령어

display <lvalue> : s(step)명령 수행시 매번 lvalue값을 출력
enable/disable display <display번호> : 설정한 번호의 display를 활성화/비활성화



3. 진행 관련 명령어

watch <lvalue> : lvalue에 값이 써질때 마다 브레이크
rwatch <lvalue> : lvalue에서 값을 읽을 때 마다 브레이크

thread [n] : n번째 스레드로 이동(info thread 명령어로 스레드별 정보 조회 가능)

frame [n] : n번째 스택 프레임으로 이동
up [n] : n번째 상위 스택으로 이동
down [n] : n번째 하위 스택으로 이동

※ 'bt' 명령어로 조회되는 결과에서 앞쪽에 있는 숫자가 스택 번호임 


Posted by KT한
,