嵌入式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