樹莓派下搭建[gdb+gdbserver]&nbsp…

最近在學習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 <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上。這時候樹莓派上會有回顯:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章