树莓派下搭建[gdb+gdbserver] …

最近在学习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);

在其后面加上以下代码:

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;

}

}

注意:这个修改只是针对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

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上。这时候树莓派上会有回显:

clip_image002

在ubutu里输入l可以查看原代码,

clip_image003

输入b 8 在第8行插入一个断点,输入c继续执行,到第八行时会停下。

clip_image004

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查看寄存器内容。程序最后的寄存器状态如下:

clip_image005

你可能感兴趣的:(树莓派)