最近在學習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上。這時候樹莓派上會有回顯:
在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查看寄存器內容。程序最後的寄存器狀態如下: