歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Ubuntu 10.04成功移植gdbserver及gdbserver使用介紹

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

日期:2017/3/1 9:55:42   编辑:Linux編程

在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