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

PC主機:Ubuntu 10.4 linux

目標板:TQ2440開發板,linux內核2.6.30ubuntu

NOTE:爲了使用gdb進行調試,強烈建議使用nfs服務,不然調試會很是麻煩。測試

使用nfs服務能夠參考:S3C2440掛載NFS文件系統ui

1. 概述

所謂遠程調試,就是開發板上創建一個gdb服務端,同時待調試的程序也位於開發板,而後在PC機上使用gdb發起遠程鏈接來進行調試。也就是說,在PC端調試開發板上的程序。請注意,在PC端須要包含被調試程序的符號調試信息(symbolic debug information),所以強烈建議使用NFS,不然須要兩份被調試的應用程序,一份供gdb使用,另外一份供gdbserver使用。spa

2. 安裝GDB服務

下載gdb安裝包,下載地址:http://ftp.gnu.org/gnu/gdb/ .net

這裏使用的是7.4。debug

解壓安裝包:調試

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

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

在開始編譯以前,你必須知道你的交叉編譯器的名字。個人交叉編譯器是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。

3. 使用gdb調試

測試程序爲hello.c,程序以下:

 

[cpp]  view plain  copy
 
  1. #include <stdio.h>  
  2.   
  3. void main()  
  4. {  
  5.     printf("hello world\n");  
  6.     printf("hello world\n");  
  7. }  

使用交叉編譯器編譯該文件,使用-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");
(gdb) n
7    }

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

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

相關文章
相關標籤/搜索