因為有很多小伙伴是從單片機轉(zhuǎn)過來的,用慣了單片機使用JLINk來調(diào)試程序,換到Linux非常不習(xí)慣。確實是如此,如果能在Linux上能設(shè)置斷點,單步調(diào)試,查看變量,那就再好不過了。那么接下來將教大家怎么在arm板上調(diào)試應(yīng)用代碼的方法。 首先,了解下基本的思路: 采用這種方式進行遠程調(diào)試,目標系統(tǒng)必須包括gdbserver程序,宿主機也必須安裝gdb程序。一般Linux發(fā)行版中都有一個可以運行的gdb,但我們不能直接使用該發(fā)行版中的gdb來做遠程調(diào)試,而要獲取gdb的源代碼包,針對arm平臺做一個簡單的配置,重新編譯得到相應(yīng)的gdb,如armv4. 搭建環(huán)境 UBuntu版本:Ubuntu 12.04 交叉編譯器:arm-2009q3.tar.bz2 gdb版本:gdb-7.8.1.tar.gz 開發(fā)板硬件:i.MX6ULL 終結(jié)者 開發(fā)板系統(tǒng):支持ssh的busybox 注意事項:如果大家下載的gdb版本比較高,那么Ubuntu的GCC就必須用4.8以上的版本。交叉編譯器要選擇和自己編譯的文件系統(tǒng)一致的編譯器,因為busybox的根文件系統(tǒng)用的是arm-2009q3,所以這里編譯gdb也使用這個編譯 搭建步驟 (1)第一步:下載gdb壓縮包 下載地址:http://ftp.gnu.org/gnu/gdb/ 這里我們下載的是gdb-7.8.1.tar.gz這個版本。 (2)第二步:編譯并安裝gdb 把gdb壓縮包放到ubuntu之后,我們進入到解壓生成的文件,如圖 1示: ![]() 輸入以下命令: ./configure -target=arm-none-linux-gnueabi --prefix=/home/topeet/arm-linux-gdb/arm-linux-gdb生成Makefile。target為目標平臺,prefix為安裝路徑。 ![]() 生成Makefile成功如圖 3所示: ![]() 輸入make,編譯gdb,編譯成功如圖 4所示: ![]() 輸入make install ,安裝gdb,一會我們在ubuntu上啟動的就是這個gdb,安裝成功如圖 5所示: ![]() 進入gdb源碼下的gdb/gdbserver目錄,如圖 6所示: ![]() 輸入以下命令: ./configure -target=arm-none-linux-gnueabi --prefix=/home/topeet/arm-linux-gdb/arm-linux-gdbserver 生成Makefile,target為目標平臺,prefix為安裝路徑。 ![]() 然后執(zhí)行make CC=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc命令,注意,這里交叉編譯器一定要寫絕對路徑。 編譯過程中會出現(xiàn)圖 8錯誤: ![]() 我們打開gdb/gdbserver路徑下的config.h文件,注釋掉196行左右的HAVE_SYS_REG_H這個宏定義,然后保存退出。如圖 9所示: ![]() 打開gdb/gdbserver路徑下的linux-x86-low.c的C文件,注釋掉116行#include ![]() 再次編譯輸入make CC=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc,編譯成功如圖 11所示: ![]() 編譯完成后,使用make install 命令安裝,安裝完成后會在安裝路徑生成一個文件夾,如圖 12所示: ![]() 第三步,在ARM板上搭建遠程調(diào)試環(huán)境 (1)把gdb/gdbserver下的gdbserver 拷貝到文件系統(tǒng)busybox的bin目錄下,然后打包燒寫生成的文件系統(tǒng)rootfs.tar.bz2 (2)編寫測試程序hello.c ![]() 編譯測試程序,編譯的時候要加-g參數(shù),編譯完成之后,我們把測試代碼通過SSH放在開發(fā)板上,然后再測試代碼所在的路徑下輸入以下命令在目標板啟動服務(wù)器,其中192.168.1.5為ubuntu的IP,8000為端口號。啟動成功如圖 14所示: ![]() 再測試程序所在目錄啟動ubuntu上的gdb,這里啟動的gdb為我們剛剛安裝的gdb,我們輸入以下命令: /home/topeet/arm-linux-gdb/arm-linux-gdb/bin/arm-none-linux-gnueabi-gdb hello 啟動成功后如圖 15所示: ![]() 連接開發(fā)板,輸入以下命令,target remote 192.168.1.3:8000 192.168.1.3為開發(fā)板的IP,8000為端口號。 ![]() 連接成功后開發(fā)板會打印以下信息,如圖 17所示: ![]() 接下來,我們就可以在ubuntu上使用命令來設(shè)置斷點,單步調(diào)試開發(fā)板上的程序了,L 是顯示程序,b 7 是在第七行設(shè)置斷點,info b 是查看斷點,c 是運行。 ![]() 在串口控制臺可以看到對應(yīng)的打印信息 ![]() 打斷點的方式主要有以下幾種: break 函數(shù)名:在某個函數(shù)的入口處添加斷點 break 行號:在指定行添加斷點 break文件名:行號:在指定文件的指定行添加斷點 break行號 if 條件:當條件為真時,指定行號的斷點生效。 查看我們打的斷點,使用命令info breakpoints,可以看見我剛才打的斷點 刪除斷點,使用命令delete斷點編號來完成 運行程序,輸入命令run 輸入命令:print i,命令格式:print 變量名稱。查看指定變量數(shù)值。 我們也可以對變量i進行監(jiān)控,可以輸入命令 watch i,命令格式:watch 變量名稱。對指定變量進行監(jiān)控。. next:單步運行程序,不進入子函數(shù)。 step:單步運行程序,進去子函數(shù)。 如果我們想繼續(xù)調(diào)試呢,可以輸入命令continue 退出調(diào)試。可以使用命令quit 總結(jié): 上面的命令也可以使用簡寫,如break可以簡寫成b,簡寫表如下: ![]() |