天天看點

使用GDB進行嵌入式遠端調試

PC主機:Ubuntu 10.4 

目标闆:TQ2440開發闆,linux核心2.6.30

NOTE:為了使用gdb進行調試,強烈建議使用nfs服務,否則調試會非常麻煩。

所謂遠端調試,就是開發闆上建立一個gdb服務端,同時待調試的程式也位于開發闆,然後在PC機上使用gdb發起遠端連接配接來進行調試。也就是說,在PC端調試開發闆上的程式。請注意,在PC端需要包含被調試程式的符号調試資訊(symbolic debug information),是以強烈建議使用NFS,否則需要兩份被調試的應用程式,一份供gdb使用,另一份供gdbserver使用。

這裡使用的是7.4。

解壓安裝包:

yj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/

yj423@ubuntu:~/work_yj423/gdb-7.4$ pwd

/home/yj423/work_yj423/gdb-7.4

在開始編譯之前,你必須知道你的交叉編譯器的名字。我的交叉編譯器是arm-unknown-linux-gnueabi-gcc,在下面将會用到該名字。

首先編譯gdbserver,該程式運作在開發闆上。

執行下列指令:

yj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/

yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab

yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make

在make以後,會在目前目錄下生成可執行檔案gdbserver。

接着編譯gdb,該程式運作在PC機上。

yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../../

yj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi

yj423@ubuntu:~/work_yj423/gdb-7.4$ make

請注意執行指令時所在的目錄。執行完以後會在gdb-7.4/gdb/下生成可執行檔案gdb。我将gdb改命為armgdb。

測試程式為hello.c,程式如下:

#include <stdio.h>  

void main()  

{  

    printf("hello world\n");  

}  

使用交叉編譯器編譯該檔案,使用-g參數,生成hello。将gdbserver和hello複制到NFS的挂載點,我的挂載點為/home/yj423/nfswork。

yj423@ubuntu:~/nfswork$ ls

bin   dev  gdbserver  home  linuxrc  proc  sbin  tmp  var

boot  etc  hello      lib   mnt      root  sys   usr  welcome

可以看到gdbserver和hello。

接着,在開發闆上使用NFS:

[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs

[root@yj423 /]#cd /mnt/nfs

[root@yj423 nfs]#ls

bin        dev        gdbserver  home       linuxrc    proc       sbin       tmp        var

boot       etc        hello      lib        mnt        root       sys        usr        welcome

然後執行gdbserver:

[root@yj423 nfs]#./gdbserver localhost:2001 hello

Process hello created; pid = 948

Listening on port 2001

2001為端口号,hello表示要調試的程式。此時gdbserver等待PC機進行連結。

在PC機上執行gdb:

yj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello

Reading symbols from /home/yj423/nfswork/hello...done.

執行遠端連結:

(gdb) target remote 192.168.1.6:2001

Remote debugging using 192.168.1.6:2001

warning: Unable to find dynamic linker breakpoint function.

GDB will be unable to debug shared library initializers

and track explicitly loaded dynamic code.

0x400007b0 in ?? ()

(gdb)

這裡的192.168.1.6為開發闆的IP位址。

至此PC端的gdb和開發闆的gdbserver已經建立連接配接,接下來可以調試。

(gdb) b main

Cannot access memory at address 0x0

Breakpoint 1 at 0x83e0: file hello.c, line 5.

(gdb) c

Continuing.

warning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.

warning: Could not load shared library symbols for /lib/ld-linux.so.3.

Do you need "set solib-search-path" or "set sysroot"?

Breakpoint 1, main () at hello.c:5

5        printf("hello world\n");

(gdb) n

6        printf("hello world\n");

7    }

這裡隻是簡單的調試。後面還會有共享庫調試和多程序調試,盡請期待!

未完待續~~~~~~~~~

繼續閱讀