歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下嵌入式目標程序的在線仿真調試方法(GDB)

Linux下嵌入式目標程序的在線仿真調試方法(GDB)

日期:2017/3/1 9:17:31   编辑:Linux編程

嵌入式Linux的GDB調試環境由Host端(PC機)和Target端(ARM實驗板)兩部分組成,Host端使用arm-Linux-gdb調試工具,而Target端需要運行gdbserver,兩者之間可通過串口或網口連接,把ARM應用程序在Target端的執行情況返回Host。調試跟蹤命令從Host端中的arm-Linux-gdb中發出。

1. 下載最新的gdb軟件包

下載地址:http://ftp.gnu.org/gnu/gdb

2. 解壓文件

sudo tar -vxzf gdb-7.9.tar.gz -C /usr/local/

3. 安裝arm-linux-gdb

cd /usr/local/gdb-7.9
sudo ./configure --target=arm-linux --prefix=/usr/local/gdb-7.9/arm-gdb //安裝路徑

sudo make

sudo make install

提示安裝出錯:

WARNING: 'makeinfo' is missing on your system.

You should only need it if you modified a '.texi' file, or

any other file indirectly affecting the aspect of the manual.

You might want to install the Texinfo package:

http://www.gnu.org/software/texinfo/

從提示的錯誤來看,應該是Ubuntu 沒有安裝txtinfo(makeinfo包含在texinfo裡面)。可以看到configure的時候,運行makeinfo --version,if下面的判斷為 texinfo的版本為4.7以上的版本才行, 小於這個版本或者沒有安裝texinfo,則MAKEINFO為 $MISSING makeinfo。

安裝可以下載固件包,也可以用sudo apt-get install texinfo來安裝。最後,重新configure,make,make install,一切OK。

添加變量:arm-linux-gdb

添加環境變量,在/etc/profile中最後一行添加:

export PATH=$PATH: /usr/local/gdb-7.9/arm-gdb/bin

source /etc/profile使用命令使環境變量生效

注:我用root,但是用戶無法查看,只能先改權限,用用戶修改,再改回權限

至此,Host端的arm-Linux-gdb調試器安裝結束

4. 安裝gdbserver

◇ cd /usr/local/gdb-7.9/gdb/gdbserver

◇ sudo ./configure --host=arm-linux --target=arm-linux --prefix=/usr/local/gdb-7.9/gdb/gdbserver

◇ sudo make CC=arm-linux-gcc

注:此處不加sudo提示沒權限,加sudo則arm-linux-gcc說無此命令,所以我用的root用戶執行的,也可以使用arm-linux-gcc的絕對路徑。

注:make之後不需要執行安裝:sudo make install。

◇ sudo arm-linux-strip gdbserver去除調試信息

在目錄/usr/local/gdb-7.10/gdb/gdbserver/bin下就生成了gdbserver可執行文件

5. 配置ARM板和PC在同一網段內

配置ARM IP:ifconfig eth0 192.168.1.10 netmask 255.255.255.0 或者直接修改rcS裡的配置文件。

6. 登陸開發板

◇ telnet 188.188.187.37

7. gdbserver啟動調試文件

◇ /usr/local/gdbserver 188.188.187.38:2345 led2

Process led2 created; pid = 1004

Listening on port 2345

Remote debugging from host 188.188.187.38

此時ARM開發板就在等待遠端的調試連接了。其中188.188.187.38是遠端的IP,2345是監聽端口,led2是編譯的文件(編譯條件包括-g)。

8. PC端開啟調試

◇ sudo /usr/local/gdb-7.9/arm-gdb/bin/arm-linux-gdb -tui /mnt/share/example/led2-gdb/led2

◇ gdb>target remote 188.188.187.37:2345

此時ARM端顯示Remote debugging from host 188.188.187.38,Debug便建立連接了,可以調試了,具體的調試命令參考下面連接,這是GDB的命令,可能其中會有些不同:http://www.linuxidc.com/Linux/2016-03/129600.htm

9. GDB遠程調試錯誤解決

使用GDB 7.2版本進行遠程調試時出現:Remote ‘g’ packet reply is too long錯誤,需要修改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[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;

}

}

以上方法是通過網絡仿真的,也可以通過串口也,具體可以看gdb-7.9/gdb/gdbserver下的README,以下截取部分:

Usage (server (target) side):

For example, using a serial port, you might say:

target> gdbserver /dev/com1 emacs foo.txt

To use a TCP connection, you could say:

target> gdbserver host:2345 emacs foo.txt

Usage (host side):

For example, using a serial port, you might say:

(gdb) target remote /dev/ttyb

communicates with the server via serial line /dev/ttyb, and:

(gdb) target remote the-target:2345

Copyright © Linux教程網 All Rights Reserved