歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Ubuntu 10.04成功移植gdbserver及gdbserver使用介紹

在Ubuntu 10.04成功移植gdbserver及gdbserver使用介紹(用於CCSV5.2遠程調試ARM CORTEX-A8程序) 。

最近需要使用CCSV5使用gdbserver遠程調試ARM cortex-a8的程序,移植成功gdbserve,使用的版本包是gdb-7.1,主機環境為ubuntu10.04,開發板掛載的nfs文件系統。CCSV5已經自帶zylincdt,所以只需構建開發板端gdbserver就可以了。下面是詳細過程。

1、gdb下載安裝
 下載gdb-7.1.tar.bz2至工作目錄
 gdb源碼下載:http://ftp.gnu.org/gnu/gdb/
 命令如下:
 $tar -jxvf gdb-7.1.tar.bz2
 $cd gdb-7.1
 $sudo ./configure --target=arm-none-linux-gnueabi --enable-sim --prefix=/home/ss/develop_environment/gdb7.1
 --prefix用於指定安裝路徑
 $make
 若有錯誤
 linux-arm-low.c:61:21: error: sys/reg.h: No such file or directory
 make: *** [linux-arm-low.o] 錯誤 1
 gdb-7.1/gdb/gdbserver/linux-arm-low.c中:
 #ifdef HAVE_SYS_REG_H
 //#include <sys/reg.h>  (注釋這一行)
 #endif
 然後再重新make
 $sudo make install
 
完成後可以在/home/ss/develop_environment/gdb7.1下找到arm-linux-gdb文件
 


2、arm-linux-gdbserver的編譯安裝(gdbserver需要用gdb編譯目錄下文件所以沒有單獨發布)
 進入./gdb/gdbserver
 命令如下:
 $cd gdb/gdbserver./configure --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi
 $make CC=arm-none-linux-gnueabi-gcc
 (CC=arm-none-linux-gnueabi-gcc用於指定arm-linux編譯器)
 編譯時若出現PATH_MAX undeclared錯誤的解決方法:(大部分不出現)
 在hostio.c文件中增加
 #include <linux/limits.h>
 原因是宏PATH_MAX在<limits.h>中沒有定義,而是定義在<linux/limits.h>中
 (紅色表示我在編譯時沒有碰到這個錯誤,此錯誤是網友整理的,留在這裡以供以後參考)
 編譯成功後在當前目錄下會生成gdbserver文件,拷貝至開發板上(可放入開發板/usr/bin/目錄下,這樣在任何目錄下均可執行gdbserver命令)
 
3、這樣編譯出來的gdbserver會有問題:
 Remote ‘g’ packet reply is too long “0000000000000000000000000000000000000000000000000000000000000000000000000000000000”
 GDB遠程調試錯誤解決
 使用GDB 7.1版本進行遠程調試時出現:Remote ‘g’ packet reply is too long錯誤,需要修改gdb代碼解決,辦法是:修改gdb/remote.c文件,注釋process_g_packet函數中的下列兩行:
 //if (buf_len > 2 * rsa->sizeof_g_packet)
 //error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);
 在其後添加:
 
if (buf_len > 2 * rsa->sizeof_g_packet) {
    rsa->sizeof_g_packet = buf_len ;
    for (i = 0; i < gdbarch_num_regs (gdbarch); i++) {
        if (rsa->regs->pnum == -1)
        continue;
        if (rsa->regs->offset >= rsa->sizeof_g_packet)
        rsa->regs->in_g_packet = 0;
        else 
        rsa->regs->in_g_packet = 1;
    }   
 }

Copyright © Linux教程網 All Rights Reserved