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