前  言

關於GDB工具

GDB工具是GNU專案偵錯程式,基於命令列使用。和其他的偵錯程式一樣,可使用GDB工具單步執行程式、單步執行、跳入/跳出函式、設定斷點、檢視變數等等,它是UNIX/LINUX作業系統下強大的程式除錯工具。GDB支援多種語言,包括Ada、彙編、C/C++、D、Fortran、GO、Objective-C、OpenCL、Modula-2、Pascal和Rust。

GDB具有一種“遠端”模式,此種模式多半是在為嵌入式系統進行除錯時使用,遠端操作指的是:GDB在一部機器內執行,而要進行除錯的程式是在另一部機器上執行,支援TCP/IP協議傳輸的各種網路,在TCP/IP網路及協議上再加搭傳輸GDB專有的除錯操作通訊協議,如此便能進行遠端除錯。

創龍科技已基於IMX8、ZYNQ、AM5728、AM5708、AM437x、AM335x、T3/A40i等平臺提供了GDB程式除錯方法說明。本文件主要演示基於TLIMX8-EVM評估板的GDB程式除錯方法說明。如需其他平臺相關資料,請與我們聯絡。

開發環境

Windows開發環境:Windows 7 64bit、Windows 10 64bit

虛擬機器:VMware15.1.0

Linux開發環境:Ubuntu18.04.4 64bit

U-Boot:U-Boot-2020.04

Kernel:Linux-5.4.70

Linux SDK:5.4.70_2.3.0

硬體平臺

TLIMX8-EVM評估板(NXP i.MX 8M Mini)

圖 2 TLIMX8-EVM評估板

1 除錯環境搭建

確保已搭建好NXP i.MX 8M Mini SDK開發環境。若未完成搭建,請先參照產品資料使用者手冊目錄下的Linux開發環境搭建手冊,完成SDK開發包的安裝和配置。

然後進入SDK安裝目錄,並執行如下命令載入SDK環境變數。

Host# cd /home/tronlong/SDK/

Host# source /home/tronlong/SDK/environment-setup-aarch64-poky-linux

圖 1

如環境搭建正常,執行如下命令可檢視交叉編譯工具版本。

Host# aarch64-poky-linux-gcc -v

圖 2

2 演示程式建立與編譯

執行如下命令,新建一個GDB除錯演示程式。

Host# mkdir test

Host# cd test/

Host# gedit test.c

圖 3

在tese.c檔案中輸入如下程式碼。

#include <stdio.h>

void show() {

printf("show\n");

}

int main(int argc, char *argv[])

{

int arr[4] = {1, 2, 3, 4};

int i = 0;

for (i = 0; i < 4; i++) {

printf("arr[%d]: %d\n", i, arr[i]);

}

}

點選Save,儲存退出。

圖 4

執行如下命令,修改test資料夾的許可權。

Host# cd ..

Host# sudo chmod -R 777 test/

圖 5

執行如下命令載入SDK環境變數,並進行程式編譯。

備註:編譯時需新增-g引數,編譯過程中的警告可忽略。

編譯完成後,將在test資料夾目錄下生成可執行檔案test。

Host# cd test/

Host# source /home/tronlong/SDK/environment-setup-aarch64-poky-linux

Host# $CC -O0 -g test.c -o test

圖 6

評估板與PC機連線至同一個路由器後進行上電,執行如下命令通過網路傳輸的形式,將編譯後的可執行檔案test拷貝至評估板。

Target# ifconfig //檢視評估板的IP地址

圖 7

Host# scp test [email protected]:/home/root //將可執行檔案拷貝至評估板“/home/root/”目錄下,密碼為空即可

圖 8

Target# ls -l //檢視評估板接收的可執行檔案

圖 9

3 除錯程式執行

執行如下命令,確認虛擬機器的IP地址。

Host# ifconfig

圖 10

在評估板檔案系統test檔案所在路徑下,執行如下命令執行gdbserver程式,開啟監聽。

備註:192.168.0.83為虛擬機器的IP地址;1234為連線的埠號(自行設定);test為將要進行除錯的程式。如為Qt介面程式,則需在後面增加-qws引數。

Target# gdbserver 192.168.0.83:1234 test

圖 11

在PC機test檔案所在路徑下,執行如下命令載入SDK環境變數,並執行GDB除錯程式。

Host# source /home/tronlong/SDK/environment-setup-aarch64-poky-linux

Host# aarch64-poky-linux-gdb test //aarch64-poky-linux-gdb為SDK交叉編譯環境下的GDB交叉編譯工具鏈,test為將要進行除錯的程式

圖 12

執行如下命令,連線評估板。192.168.0.17為評估板的IP地址,請以實際情況為準。

(gdb) target remote 192.168.0.17:1234

圖 13

同時,串列埠除錯終端顯示連線成功的相關資訊。

圖 14

4 程式除錯

本章節主要演示GDB除錯的幾個常用命令的使用方法。

4.1 list命令

用於列出原始碼,簡寫:l。

圖 15

4.2 break命令

用於設定斷點,簡寫:b。

圖 16

4.3 info breakpoints命令

用於顯示斷點的狀態,簡寫:info b。

圖 17

4.4 continue命令

用於恢復程式執行,簡寫:c。此命令使GDB恢復程式的執行,直至斷點觸發或程式結束。

圖 18

以上除錯過程在第二個斷點中,每輸入一次c命令,將會依次列印arr陣列的元素值,然後程式執行結束。同時,串列埠除錯終端列印相關資訊。

圖 19

4.5 print命令

用於列印變數或者變數地址,簡寫:p。

圖 20

以上除錯過程在每處斷點中,使用print命令列印變數i的值。同時,串列埠除錯終端列印相關資訊。

圖 21

4.6 quit命令

退出GDB模式,簡寫:q。當程式除錯完成後,使用quit命令退出GDB除錯。

圖 22

同時,串列埠除錯終端列印相關資訊。

圖 23