<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

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

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    PC主機:Ubuntu 10.4 

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

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

    使用nfs服務可以參考:S3C2440掛載NFS文件系統

    1. 概述

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

    2. 安裝GDB服務

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

    這里使用的是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。

    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    }

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

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

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全