본문 바로가기

OS/Linux

gdb 및 gdbserver 컴파일 및 간단한 사용기

타겟보드에서 실행되는 프로세스를 디버깅하기 위해서는

호스트에 gdb, 타겟보드에는 gdbserver가 실행되어 있어야 한다.

따라서 타겟보드에서 실행되는 gdbserver를 컴파일하기 위해서는...

아래와 같은 작업이 필요하다.

 

gdb 6.0 설치하기
==================
wget ftp://ftp.gnu.org/gnu/gdb/gdb-6.0.tar.gz
tar xvpfz gdb-6.0.tar.gz
cd gdb-6.0
./configure --target=arm-linux
make
cd gdb/gdbserver/
chmod ugo+x configure => 실행권한이 없어 실행이 안된다. 따라서 실행모드 변경함.
./configure --target=arm-linux --host=arm-linux
vi config.h
=> 39번째줄을 주석처리한다.
=> /*#define HAVE_SYS_REG_H 1 */
make CC=arm-linux-gcc

ls /home/src/gdb-6.0/gdb/gdbserver/gdbserver
ls /home/src/gdb-6.0/gdb/gdb

[root@e-linux gdbserver]# arm-linux-objdump -x gdbserver | grep NEEDED
  NEEDED      libthread_db.so.1
  NEEDED      libc.so.6
[root@e-linux gdb]# objdump -x gdb | grep NEEDED
  NEEDED      libtermcap.so.2
  NEEDED      libm.so.6
  NEEDED      libdl.so.2
  NEEDED      libc.so.6


cp gdb /usr/local/arm/2.95.3/bin/arm-gdb
cp gdbserver /home/src/Temp => 타겟보드와 NFS로 연결됨

target>> cd /mnt/host
target>> cp gdbserver /bin => 타겟보드에 복사된 gdbserver를 /bin에 복사함

호스트에서 아래 파일을 생성함

vi debug.c
=>
#include <stdio.h>

int main()
{
        int i;
        for (i=0; i<10; i++)
                printf("hello, world!\n");

        return 0;
}

컴파일 하기... -g 옵션을 주어야 디버깅 정보를 포함하게 된다.

arm-linux-gcc -g -o debug debug.c

cp debug /home/src/Temp => 타겟보드에 복사, NFS로 연결되어 있다.

target>> cp debug /bin
target>> cd /bin
target>> ./gdbserver 10.10.1.1:2002 debug => 타겟보드에서 gdbserver 실행
./gdbserver: error while loading shared libraries: 
   cannot open shared object file:
=> error -_-;;

타겟보드의 ls /lib을 해보면 libthread_db-1.0.so가 없다.
따라서 arm사의 ftp를 통해서 cross-compiler toolchain을 받아서
호스트에 풀고 해당 모듈을 타겟에 복사해 준다.

cd /home/src/2.95.3/arm-linux/lib
cp libthread_db-1.0.so /home/src/Temp
target>> cp /mnt/host/libthread_db-1.0.so /lib
target>> ln -s libthread_db-1.0.so libthread_db.so 
target>> ln -s libthread_db-1.0.so libthread_db.so.1

 

target>> ./gdbserver 10.10.1.1:2002 debug => 다시 gdbserver 실행시도
=> Process debug created; pid = 125

 

host>> cd /usr/local/arm/2.95.3/bin
./arm-gdb debug
(gdb) target remote 10.10.1.2:2002
Remote debugging using 10.10.1.2:2002
0x40002a90 in ?? ()
(gdb) list
No symbol table is loaded.  Use the "file" command.
=> 심볼파일이 로딩이 안되네. 쩝... -_-;;

=> debug 프로그램이 해당 디렉토리에 없어서 발생한 문제이다.

 

cd /root => 여기에 debug 프로그램이 존재한다.
arm-gdb debug
(gdb) target remote 10.10.1.2:2002
Remote debugging using 10.10.1.2:2002
0x40002a90 in ?? ()
(gdb) list
1       #include <stdio.h>
2
3       int main()
4       {
5               int i;
6               for (i=0; i<10; i++)
7                       printf("hello, world!\n");
8
9               return 0;
10      }
(gdb)

 

아래와 같은 명령어를 실행해 본다.

continue
display i
step