노무현 대통령 배너


2006. 8. 10. 10:49

개발 서버에 gdb 설치 하고 사용하기

출처: http://www.falinux.com/win/02_config/gdb/010.htm

개발 서버에 gdb 설치 하고 사용하기
목차 | 이전 | 다음

소프트웨어와 관련된 인터넷 동호회를 살피다 보면 프로그래머들끼리 열띤 논쟁을 하는 것 중의 하나가 바로 어떤 컴파일러가 좋으냐는 것입니다.

비쥬얼 C를 쓰는 사람들과, 델파이를 쓰는 사람, 비쥬얼 베이직을 쓰는 사람들이 서로의 생산성과 프로그램의 성능에 대해 때론 감정까지 섞어 가며 논쟁을 벌입니다. 그런데 가만히 보면 그 내용이 프로그램 결과물의 성능에 맞추어 지는 경우가 많이 있습니다.

이 컴파일러로 이런 코드를 컴파일해서 돌렸더니 몇 초더라, 이건 딴 거 보다 한참 늦어 세월이더라 하는 등등....

그러나 우리가 프로그램을 개발 하다 보면 사실은 그 실행 속도에 신경을 쓰는 시간은 얼마 되지 않습니다.

저는 워낙 실력이 허접해서 그런지 일단 프로그램이 돌아가는 것이 관건인 경우가 많죠. 일단 돌면 그때부터 길고 지루한 디버깅 작업이 시작됩니다.

특히 임베디드의 소프트웨어의 경우 윈도우에서 개발 하는 것처럼 고급 디버깅 툴을 제공하지 않기 때문에 printk나 printf문을 대량 살포 하여 꼭꼭 숨은 버그가 걸리기 만을 기다리게 됩니다.

내 거미줄에만 걸려 주면 좋겠는데 하며 프로그램을 돌리고 돌리고......

이렇게 거미줄처럼 프로그램 소스에 printf문을 넣어서 버그를 잡는 방법은 너무나 소극적이고 그 버그가 시스템의 안쪽 깊숙이 숨어버린 경우에는 찾아내는 것만으로도 무척이나 인내심을 요하기도 합니다.

짜잔~~~

그런데 여기 버그를 찾으러 나설 날개 달린 옷과 멋진 창이 준비 되어 있습니다.^^

이름하여 gdb......

이 gdb는 gcc로 프로그램한 코드를 추적하여 어디서 결정적인 버그가 발생 하는지 적극적으로 찾아 나설 수 있습니다. 더더욱 반가운 일은 gdb서버를 이용하여 타겟보드에서 발생하는 오류까지도 찾아 낸다는 것입니다.

정말 날개 옷을 입은 것 같죠?

그럼 지금부터 우리의 날개 옷을 찾으러 갑시다.

1. 파일 찾기

gdb 5.2 : gdb 개발 호스트와 gdbserver 타겟보드 패키지

ftp://ftp.gnu.org./pub/gnu/gdb/gdb-5.2.tar.gz

미러링 ftp://linux.sarang.net/pub/mirror/gnu/gnu/gdb/gdb-5.2.tar.gz

위의 파일에는 gdb 개발 호스트와 gdbserver가 모두 있습니다.

2. 컴파일 하기

gcc는 크로스 컴파일이 가능 하기 때문에 각 플랫폼별로 컴파일러의 버전이 다릅니다. 따라서 gdb도 각각의 용도에 맞춰 컴파일을 다시 해야 합니다.

이지보드는 ARM 기반의 MCU를 쓰고 있기 때문에 ARM용 gdb컴파일에 대해서만 설명 하겠습니다.

일반 데스크 탑 컴퓨터에서 개발하고 거기에 gdb를 사용하신 다면 당연히 gcc를 i386용으로 컴파일하고 그 컴파일 된 gcc를 이용하여 다시 gdb를 컴파일 해야 할 것입니다.

지금부터는 개발 호스트 컴퓨터에 ARM용 개발 툴킷이 설치되어 있는 것으로 간주하고 진행 하겠습니다.

개발 툴킷이 설치되지 않은 분들은 개발환경구축에 관련된 강좌를 먼저 보시기 바랍니다.

ARM 용 gdb 컴파일

$cd /home/embedded/arm/

$tar xvfpz gdb-5.2.tar.gz

$./configure -target=arm-linux --prefix=/usr/local/arm-dev -v

$make

$su - root

Password:*****

#make install

일단 적당한 곳에 gdb-5.2.tar.gz를 풀어 놓습니다. 그리고 make 파일을 만들기 위해 configure를 실행 합니다.

같이 붙어 있는 옵션은 우선 --target 이것은 gdb를 컴파일 할 때 어떤 컴파일러로 할 지 정해 주는 것입니다.

우리는 arm-linux를 해야 겠죠?

이렇게 하면 arm-linux-gcc가 컴파일러로 설정 됩니다.

그 다음은 결과물이 어디로 들어 갈 것인가 하는 것입니다.

여기서는 /usr/local/arm-dev로 정했습니다.

그리고 make합니다.

그 다음에 root권한을 획득하여 make install 합니다.

이렇게 하면 gdb에서 생성된 라이브러리가 자기들이 들어가 있어야 할 곳으로 들어 갑니다.

이렇게 하여 gdb호스트를 컴파일 하였습니다.

이제 남은 것은 우리의 날개가 되어줄 gdb서버입니다.

우선 PATH에 우리가 컴파일 하여 들어간 gdb관련 파일이 있는 위치를 등록 시킵니다.

그리고 다시 configure를 실행합니다.

config.h에는 무슨 파일이 없다는 오류 메시지는 내는 내용이 있습니다.

그 부분을 주석처리 합니다.

아래 코드 중에 sed 머 어쩌구 하는 부분은 편집기를 열어 HAVE_SYS_REG_H를 선언한 부분을 주석처리 해버리면 커맨드라인에서 실행 하지 않아도 됩니다.

또 gdb전체를 다시 컴파일 할 필요 없이 /gdb/gdbserver 디렉터리에서 명시적으로 gdbserver를 컴파일 합니다.

그리고 make 하는데 옵션은 arm-linux-gcc로 하라는 것이죠......

$cd /home/embedded/arm/gdb-5.2

$export PATH='echo $PATH':/usr/local/arm-dev/bin

$./configure --target=arm-linux --host=arm-linux

$cd gdb/gdbserver

$mv config.h config.h.org

$sed "s/#define HAVE_SYS_REG_H 1//*#define HAVE_SYS_REG_H 1*//1" config.h.org > config.h

$rm config.h.org

$make CC=arm-linux-gcc

이렇게 하면 이제 멋진 날개 옷과 쓸만한 창이 준비된 것입니다.

이제 이것들을 어떻게 이용하여 나쁜 벌래 들을 잡는지 보겠습니다.

3. 사용하기

우선 개발 호스트와 타겟보드 사이에는 TCP/IP통신이 되어야 합니다. 따라서 양쪽에 모두 IP주소가 설정되어 있어야 합니다.

gdb는 시리얼 통신에 의한 디버깅도 가능하다고 합니다만 저는 해보지 않았습니다. 이지보드가 네트웍을 지원하기 때문에 굳이 하지 않아도 됐거든요.

우선 실행 파일을 컴파일 할 때 -g 옵션을 주어 컴파일 해야 합니다. 그래야만 gdb가 실행 파일로부터 정보를 얻어 올 수 있기 때문입니다.

컴파일이 끝나면 gdbserver와 실행 파일을 타겟보드에 카피합니다.

타겟 보드 설정

[root@ezboard /gdbserver]$ ./gdbserver 192.168.10.150:6161 [실행파일이름]

Process debug create; pid = 994

위의 아이피 뒤에 붙은 포트 번호는 1024 이상을 지정해 주는 것이 좋습니다.

pid는 수행 할 때 마다 달라질 수 있습니다.

개발 호스트 디버깅 본격적인 디버깅 작업은 개발 호스트에서 합니다. 타겟보드에서 실행한 실행 파일이 같이 있어야 합니다.

[root@jdt gdb]$ gdb [아까 타겟보드에서 실행한 실행 파일의 이름]

GNU gdb 5.2

Copyright 2002 Free Software Foundation, Inc.

GDB is free

………………………

………………………

어쩌구 저쩌구 하고 나옵니다.

그리고

(gdb)

이렇게 나옵니다.

여기에 gdb명령어를 입력 합니다.

우선 타겟보드를 설정해 줍니다.

(gdb) target remote 192.168.10.51:6161

192.168.10.51:6161: Success.

이렇게 나오면 본격적으로 gdb가 타겟보드와 함께 돌아 갑니다.

지금부터는 gdb명령어를 사용해 디버깅 작업을 해 나갑니다.

list, break, run, step, display, next 등이 gdb명령어 입니다.

help를 입력하면 gdb명령어들을 볼 수 있습니다.

gdb의 사용법은 gdb에 관련된 서적을 보면 알 수 있습니다.

이상의 강의 내용에 참고가 될만한 서적은

박재호님의 한빛미디어출판 IT TXPERT 임베디드 리눅스

정보문화사의 LINUX Programming 언리쉬드 입니다.

즐코 하시기 바랍니다. ^^

내가 좋아하는 빨~간 장미