<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>
  • 網站首頁 > 物聯資訊 > 技術分享

    gdbserver遠程調試嵌入式linux應用程序方法

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 此處所講的是基于gdb和gdbsever的遠程調試方法。環境為:PC機:win7、虛擬機:10.04、下位機:飛嵌TE2440開發板。   嵌入式linux應用程序的開發一般都是在linux里面編寫好代碼,并用交叉編譯器arm-linux-gcc編譯好之后再下載到板子上運行。如果建立了遠程調試(能夠在PC機ubuntu中調試板子中的linux應用程序),這樣對于開發程序是極其方便的。   以下是摘自網絡上的一些方法。其中加入了自己所遇到的一些問題,并提出了解決方法。   1、首先建立nfs文件系統,讓PC機ubuntu上的文件系統這里假設路徑為:/home/xxx/work/可以掛載到板子上去。方法可以見本博的另一篇文章。其中IP環境是PC機win7的IP為192.168.0.11(這個不重要,只要保證在同一個網段即可)。虛擬機中IP為:192.168.0.57。下位機中的IP為192.168.0.16。   2、安裝交叉編譯環境arm-linux-gcc等工具。方法可以網上找。這里假設已經安裝好,并且版本是3.4.1。路徑為:/usr/local/arm/3.4.1/bin。并建好環境變量。   3、下面我們就來測試一個簡單的例子。 /*Hello.c*/
    #include 
    int main()
    {
    printf(“hello word!\n”);
    return 0;
    }
    程序輸好以后確認無誤,保存。進入程序文件所在目錄
    # arm-linux-gcc hello.c –o hello
    將hello文件放入nfs共享目錄中/home/xxx/work/中,并在串口終端中執行hello程序./hello。   4、安裝gdb和gdbserver 要經行gdbserver遠程調試,還必須安裝gdb遠程調試工具:
    gdb的源代碼包可以從http: //ftp.cs.pu.edu.tw/Linux/sourceware/gdb/releases/下載,我下載的是gdb-6.6。下載到某個目錄,筆者下載到自己的用戶目錄
    下載完后,進入該目錄,配置編譯步驟如下:
    #tar jxvf gdb-6.6-tar-bz2
    #cd gdb-6.6
    #./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v
    #make
    執行到此步之后我出現了如下的錯誤 cc1: warnings being treated as errors
    /root/tools/gdb-6.6/bfd/elf32-arm.c: In function 'find_thumb_glue':
    /root/tools/gdb-6.6/bfd/elf32-arm.c:2452: error: ignoring return value of 'asprintf', declared with attribute warn_unused_result
    /root/tools/gdb-6.6/bfd/elf32-arm.c: In function 'find_arm_glue':
    /root/tools/gdb-6.6/bfd/elf32-arm.c:2485: error: ignoring return value of 'asprintf', declared with attribute warn_unused_result
    這個由于返回值沒有被接收 導致編譯中斷 這是因為makefile中加入了-Werror導致將警告當成了錯誤 將下列文件中的-Werror選項刪除后保存即可重新編譯成功
    bfd/Makefile:185:WARN_CFLAGS = -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror
    opcodes/Makefile:175:WARN_CFLAGS = -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror
    接下來執行: #make install
    #export PATH=$PATH:/usr/local/arm-gdb
    進入gdbserver目錄(在gdb目錄下):
    #./configure --target=arm-linux –host=arm-linux
    #make CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc
    (這一步要指定arm-linux-gcc的位置,可能跟你的不一樣)
    這時,可能又會遇到一個錯誤 /usr/local/arm/3.4.1/bin/arm-linux-gcc -c -Wall -g -O2    -I. -I. -I./../regformats -I./../../include -I../../bfd -I./../../bfd linux-arm-low.c

    linux-arm-low.c:35:21: sys/reg.h: No such file or directory

    因為sys/reg.h在ubuntu中 /usr/include/sys/reg.h目錄中,所以可以加上 -I/usr/include

    然后單獨運行:/usr/local/arm/3.4.1/bin/arm-linux-gcc -c -Wall -g -O2    -I. -I. -I./../regformats -I./../../include -I../../bfd -I./../../bfd -I/usr/include linux-arm-low.c

    OK!!!!!

    再運行一遍

    #make CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc

    沒有錯誤的話就在gdbserver目錄下生成gdbserver可執行文件,把它燒寫到flash的根文件系統分區,或通過nfs mount的方式都可以。只要保證gdbserver能在開發板上運行就行。

     

    5、安裝必要的庫libthread_db-1.0.so

    如果你的嵌入式linux沒有安裝libthread_db-1.0.so這個庫的話,在板子中運行gdbserver會提示錯誤。解決方法如下:

    將你的arm-linux-gcc的交叉編譯環境中的/usr/local/arm/3.4.1/arm-linux/lib下的libthread_db-1.0.so文件拷貝到下位機TE2440開發板的根目錄下的/lib中去(可以先放入nfs共享文件夾中然后再在串口終端中輸入拷貝命令)。并在/lib目錄建立一個一個指向libthread_db-1.0.so的軟鏈接libthread_db.so.1。

    命令如下:#ln -s libthread_db-1.0.so libthread_db.so.1

    執行完之后,再次運行gdbserver  ./gdbserver之后不會再提示找不到庫了。

     

    6、調試hello程序

    要進行gdb調試,首先要在目標系統上啟動gdbserver服務。在gdbserver所在目錄下輸入命令:(串口終端中)
    #cd /tmp
    #./gdbserver 192.168.2.57:2345 hello
    192.168.2.57為宿主機IP,在目標系統的2345端口開啟了一個調試進程(避免使用1024以下的端口號),hello為要調試的程序。
    出現提示:
    Process /tmp/hello created: pid="80"
    Listening on port 2345

    在虛擬機ubuntu中的終端里面輸入

    #cd /

    #export PATH=$PATH:/usr/local/arm-gdb/bin
    #arm-linux-gdb hello
    (gdb) target remote 192.168.2.223:2345
    (192.168.2.223為開發板IP)
    出現提示:
    Remote debugging using 192.168.2.223:2345
    [New thread 80]
    [Switching to thread 80]
    0x40002a90 in ??()
    同時在串口中終端下提示:
    Remote debugging from host 192.168.2.100
    (gdb)
    連接成功,這時候就可以輸入各種gdb命令如list、run、next、step、break等進行程序調試了。
    至于出現了0x40002a90 in ??()的問題是因為arm-linux-gdb的共享庫路徑沒有進行設置。找不到庫文件。通過輸入下列語句可以解決問題。 set solib-absolute-prefix /usr/local/arm/4.4.3/arm-none-linux-gnueabi/sys-root/  RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全