树莓派下搭建[gdb+gdbserver]&nbsp…
2014-03-13 23:40
218 查看
最近在学习arm汇编的知识,就想着可不可以在树莓派搭建一个arm汇编的调试环境,可以实现arm汇编程序的单步调试之类的功能。我选择的使用的是gdb+gdbserver+qemu的方式。
我的实验环境如下:
Ubuntu12.04LTS (安装在VMware-workstation-full-9里)
树莓派
下面是我安装的详细配置
1.
编译安装gdb-7.5=========================================
首先到http://www.gnu.org/software/gdb/
下载gdb-7.5.tar.gz。
a) 下载后解压:输入
tar zxvf gdb-7.5.tar.gz
b) 修改/ gdb-7.5/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);
在其后面加上以下代码:
注意:这个修改只是针对7.x的版本,对于久版本不清楚。这是为了修正gdb-7.5远程调试中的Remote ‘g’ packet
reply is too long错误。
c) 编译gdb
这里先要安装一个程序包,之后需要它的支持
sudo apt-get install libncurses5-dev
进到gdb7.5/目录下(注意不要进错目录),设置安装的目录和一些参数。输入
./configure --target=arm-linux --prefix=/usr/local/arm-gdb
编译
make
安装
make install
如果都没有报错,就代表安装成功了。
接着修改/etc/bash.bashrc文件,把arm-linux-gdb加入到环境变量。在最后加上
if [ -d /usr/local/arm-gdb/bin ]; then
PATH=/usr/local/arm-gdb/bin:$PATH
fi
使修改生效:
source /etc/bash.bashrc
d) 编译gdbserver
#cd ./gdb/gdbserver
#./configure --target=arm-linux --host=arm-linux
#make CC=arm- linux –gcc
把编译好的gdbsever文件放到/armfs中去。这个可执行文件要被树莓派来使用。/armfs是我的ubuntu和树莓派的共享文件夹。
2.
测试====================================================
编写一个小程序测试test.c。代码如下:
#include <stdio.h>
int main(){
int a, b, c ;
a=0;
b=0;
c=a+b;
return 0;
}
输入:arm-linux-gcc -o test.exe -g test.c
把test.exe放到ubuntu的nfs共享目录中去。我的目录为/armfs。关于怎么搭建nfs共享目录,前面关于树莓派交叉编译环境的搭建的博文里面有。
把/armfs mount 到树莓派上。在树莓派的终端中输入:
mount –t nfs –o nolock 169.254.8.175:/armfs /mnt
如果是复制粘贴命令的话,注意树莓派里的”–”要短些。这里最后自己输入。169.254.8.175是我的ubuntu的ip。
在树莓派的/mnt目录下,输入
./gdbserver 169.254.8.175:6666 test.exe
这里指明监听的端口是6666,169.254.8.175是我的ubuntu的ip。调试将在ubuntu上进行。
接着在ubutu的终端里输入arm-linux-gdb test.exe
再输入target remote
169.254.8.100:6666,告诉gdb运行的程序在169.254.8.100:6666上。这时候树莓派上会有回显:
在ubutu里输入l可以查看原代码,
输入b 8 在第8行插入一个断点,输入c继续执行,到第八行时会停下。
3. 调试汇编程序
写一个小小的汇编程序test.s:
在树莓派上输入:
arm-linux-as test.s -o test.o
arm-linux-ld test.o -o tests
把tests拷贝到/armfs下,
在树莓派下输入:
./gdbserver 169.254.8.175:6666 tests
在ubuntu下输入arm-linux-gdb tests
(gdb) target remote 169.254.8.100:6666
这时程序停在第一行的位置。可以输入si,使程序运行一步,再输入info
register查看寄存器内容。程序最后的寄存器状态如下:
我的实验环境如下:
Ubuntu12.04LTS (安装在VMware-workstation-full-9里)
树莓派
下面是我安装的详细配置
1.
编译安装gdb-7.5=========================================
首先到http://www.gnu.org/software/gdb/
下载gdb-7.5.tar.gz。
a) 下载后解压:输入
tar zxvf gdb-7.5.tar.gz
b) 修改/ gdb-7.5/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[i].pnum == -1) continue; if (rsa->regs[i].offset >= rsa->sizeof_g_packet) rsa->regs[i].in_g_packet = 0; else rsa->regs[i].in_g_packet = 1; } } |
reply is too long错误。
c) 编译gdb
这里先要安装一个程序包,之后需要它的支持
sudo apt-get install libncurses5-dev
进到gdb7.5/目录下(注意不要进错目录),设置安装的目录和一些参数。输入
./configure --target=arm-linux --prefix=/usr/local/arm-gdb
编译
make
安装
make install
如果都没有报错,就代表安装成功了。
接着修改/etc/bash.bashrc文件,把arm-linux-gdb加入到环境变量。在最后加上
if [ -d /usr/local/arm-gdb/bin ]; then
PATH=/usr/local/arm-gdb/bin:$PATH
fi
使修改生效:
source /etc/bash.bashrc
d) 编译gdbserver
#cd ./gdb/gdbserver
#./configure --target=arm-linux --host=arm-linux
#make CC=arm- linux –gcc
把编译好的gdbsever文件放到/armfs中去。这个可执行文件要被树莓派来使用。/armfs是我的ubuntu和树莓派的共享文件夹。
2.
测试====================================================
编写一个小程序测试test.c。代码如下:
#include <stdio.h>
int main(){
int a, b, c ;
a=0;
b=0;
c=a+b;
return 0;
}
输入:arm-linux-gcc -o test.exe -g test.c
把test.exe放到ubuntu的nfs共享目录中去。我的目录为/armfs。关于怎么搭建nfs共享目录,前面关于树莓派交叉编译环境的搭建的博文里面有。
把/armfs mount 到树莓派上。在树莓派的终端中输入:
mount –t nfs –o nolock 169.254.8.175:/armfs /mnt
如果是复制粘贴命令的话,注意树莓派里的”–”要短些。这里最后自己输入。169.254.8.175是我的ubuntu的ip。
在树莓派的/mnt目录下,输入
./gdbserver 169.254.8.175:6666 test.exe
这里指明监听的端口是6666,169.254.8.175是我的ubuntu的ip。调试将在ubuntu上进行。
接着在ubutu的终端里输入arm-linux-gdb test.exe
再输入target remote
169.254.8.100:6666,告诉gdb运行的程序在169.254.8.100:6666上。这时候树莓派上会有回显:
在ubutu里输入l可以查看原代码,
输入b 8 在第8行插入一个断点,输入c继续执行,到第八行时会停下。
3. 调试汇编程序
写一个小小的汇编程序test.s:
.text .align 2 .global _start _start: mov r1,#1 mov r2,r1,r1,lsl #2 add r2,r2,r1 mov r0, #0 swi #0x900001 .align 2 |
arm-linux-as test.s -o test.o
arm-linux-ld test.o -o tests
把tests拷贝到/armfs下,
在树莓派下输入:
./gdbserver 169.254.8.175:6666 tests
在ubuntu下输入arm-linux-gdb tests
(gdb) target remote 169.254.8.100:6666
这时程序停在第一行的位置。可以输入si,使程序运行一步,再输入info
register查看寄存器内容。程序最后的寄存器状态如下:
相关文章推荐
- SQL&nbsp;Server&nbsp;DATEDIFF()&nbsp;函数
- 转&nbsp;SQL&nbsp;Server&nbsp;htt…
- VisualSVN Server搭建SVN服务器&lt;转&gt;
- 关于&quot;The&nbsp;RPC&nbsp;server&nbsp;is&nbsp;unavailab…
- ArcGis Server开发入门(转载)
- arcgis&nbsp;server&nbsp;发布wfs、wms服务注…
- [转载]Windows Server 2008 R2 之二十五AD RMS信任策略
- geoserver 地图显示、 …
- 基于 PHP & MySQL 搭建OAuth Server
- iOS常见问题【debug】 gdb
- [转]Sql Server 2005更新SP3补丁后…
- SQL Server导出导入数据方法
- SQLSERVER&nbsp;常用命令
- SQL Server 存储过程
- gdbserver: can't bind address: address already in use
- Ubuntu Server 14.04 搭建 Q&A
- [原]eclipse 编译c/c++环境搭建问…
- 关于SQL&nbsp;SERVER&nbsp;2008从suspect状态…
- 书评:Microsoft&nbsp;SQL&nbsp;Server企业级…
- mysql&nbsp;replication&nbsp;的搭建