环境:
目标板: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、在开发板上必须开通远程调试所需要的端口,否则远程调试机无法通过端口远程连接到开发板上。
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/
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
调试成功。