实现ARM-Linux远程交叉调试---arm-linux-gdb(gdbclient)+gdbserver

环境:
    目标板:ARM Cortex A9

    交叉编译的环境:ubuntu

所需安装包:
    1、ncurses-5.9.tar.gz(下载网址:http://linux.softpedia.com/get/Programming/Libraries/Ncurses-6097.shtml#download)

    2、gdb-7.8.1.tar.gz(下载网址:http://ftp.gnu.org/gnu/gdb/  )

前言:

利用GDB进行远程调试,首先需要明确一下几点:

1、调试用的GDB必须是交叉编译产生的GDB;

2、调试的程序必须是交叉编译且带 “-g” 选项的可执行程序。

3、在宿主机和目标开发板上调试的必须是同一个可执行程序。

4、基于 3 ,我们必须要建立一个宿主机和开发板的NFS共享目录,以实现调试调试同一可执行程序。

5、目标开发板的gdbserver和宿主机用的GDB版本必须相同,最好是同一源文件编译同时产生的。

6、在开发板上必须开通远程调试所需要的端口,否则远程调试机无法通过端口远程连接到开发板上。
 

移植过程:

一、编译运行在PC端的gdbclient程序arm-linux-gdb

1) 解压

tar -xzvf gdb-7.8.1.tar.gz

2) 创建目标安装文件夹

cd gdb-7.8.1

mkdir _install

3) 配置

./configure --target=arm-none-linux-gnueabi --prefix=${PWD}/_install --disable-werror

*************修改源代码**************************

如果不修改,gdb执行l列出源代码时会出错!

(gdb) l

Remote 'g' packet reply is too long: 00000000ccade1be0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0ace1be00000000c0770d40100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

​需要修改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;

    }

  }

4)编译

make -j4

5)安装

make install   (.../_install/bin/目录下生成arm-none-linux-gnueabi-gdb 和 arm-none-linux-gnueabi-run
两个可执行程序)

6)去除调试信息,减小内存占用

strip arm-none-linux-gnueabi-gdb

7)拷贝到原来交叉编译器(arm-linux-gcc路径下覆盖之前的arm-linux-gdb)

cp arm-none-linux-gnueabi-gdb  /usr/local/arm/arm-2009q3/bin/


 

二、编译ARM端运行的gdbserver


1、ncurses的交叉编译

NOTE:ncurses为gdb的链接库,应该是没有这个库的话,gdb就编译不过去。有试着直接交叉编译gdb,在configure时候,就报找不到libterm的错误。

1) 解压

tar -xzvf ncurses-5.9.tar.gz

2) 创建目标安装文件夹

cd ncurses-5.9

mkdir _install

3) 配置

./configure --host=arm-none-linux-gnueabi --prefix=${PWD}/_install  --without-ada --enable-termcap --with-shared
4) 编译

make -j4

5) 安装

make install
 


2、gdbserver的交叉编译

1) 解压

tar -xzvf gdb-7.8.1.tar.gz

2) 创建目标安装文件夹

cd gdb-7.8.1

mkdir _install

3) 配置

./configure --host=arm-none-linux-gnueabi --enable-shared --prefix=${PWD}/_install --without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext LDFLAGS="-L/home/jiangyu/software/gdb/ncurses-5.9/_install/lib" CPPFLAGS="-I/home/jiangyu/software/gdb/ncurses-5.9/_install/include"

Ø        --enable-shared    动态编译

Ø        --host=arm-none-linux-gnueabi  用arm-none-linux-gnueabi-gcc编译

Ø        --prefix=$PWD/_install 安装目录

Ø        --without-x     取消x windows 支持

Ø        --disable-gdbtk  取消gdbtk,应该也是图形界面相关的

Ø        --disable-tui   取消tui 界面

Ø        --without-included-regex 关闭正则表达式库

Ø        --without-included-gettext  去掉用于多语言处理的 gettext库正则表达式/gettext,暂时不需要,先去掉

Ø        CPPFLAGS/LDFLAGS是确保能找到ARM版的ncurses库

4) 编译

make -j4

5) 安装

make install


3、拷贝到ARM板

1).拷贝依赖库libncurses.so

    cp  libncurses.so.5.9   /home/jiangyu/rootfs/lib/

    ln  -s   libncurses.so.5.9   libncurses.so

2).拷贝gdbserver程序

  (拷贝前去掉调试信息 ,减小文件大小,执行命令: arm-linux-uclibcgnueabi-strip gdbserver)

     cp  gdbserver  /home/jiangyu/rootfs/usr/sbin

(拷贝的东西都需要记住加权限)


三、调试

      (ARM板上执行gdbserver,作为server端,PC上执行arm-linux-gdb作为client端进行远程调试,编译代码时加入-g调试选项)

1)Target端(ARM板)建立远程调试服务

执行gdbserver 192.168.31.107:8889  gdbtest

(192.168.31.107为本机IP,8889为端口)

[root@Itop4412 ]#gdbserver 192.168.31.107:8889  gdbtest

(3)Host端(PC)GDB加载要调试的程序

执行:arm-none-linux-gnueabi-gdb gdbtest​

​(4)连接到目标板调试服务

执行:target remote 192.168.31.107:8889​

(192.168.31.107是开发板IP)​

​执行l列出源代码

​(gdb) l

设置断点

​(gdb) b 9

执行

​(gdb) c

若产生这个错误主要是由于该调试的应用程序使用到了额外的库,而这个库在gdb默认的搜索路径内没有 
(相对与远程调试,gdb默认搜索的路径即为交叉编译器的库路径,下面我会介绍到) 
因此,这里我们需要修改一下gdb默认的共享库搜索路径。 

set solib-search-path /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/

solib-absolute-prefix设置的是被搜索文件路径的前缀,一般设置为交叉编译工具链的库路径前缀,即不包括lib目录,lib目录的父目录,solib-search-path设置的是被搜索库文件的路径。solib-search-path可以有多个路径,中间按用:隔开, solib-absolute-prefix的值只能有一个。若在solib-absolute-prefix指定的路径内没有搜索到库,则再继续尝试从solib-search-path指定的路径进行搜索。

 

再次执行:

(gdb)c

调试成功。

你可能感兴趣的:(嵌入式)