<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux的GDB遠(yuǎn)程調(diào)試的實(shí)現(xiàn)

          嵌入式Linux的GDB遠(yuǎn)程調(diào)試的實(shí)現(xiàn)

          作者: 時(shí)間:2013-12-05 來(lái)源:網(wǎng)絡(luò) 收藏

            遠(yuǎn)程調(diào)試環(huán)境由宿主機(jī)GDB和目標(biāo)機(jī)調(diào)試stub共同構(gòu)成,兩者通過(guò)串口或TCP連接。使用GDB標(biāo)準(zhǔn)遠(yuǎn)程串行協(xié)議協(xié)同工作,實(shí)現(xiàn)對(duì)目標(biāo)機(jī)上的系統(tǒng)內(nèi)核和上層應(yīng)用的監(jiān)控和調(diào)試功能。調(diào)試stub是系統(tǒng)中的一段代碼,作為宿主機(jī)GDB和目標(biāo)機(jī)調(diào)試程序間的一個(gè)媒介而存在。
           
            就目前而言,系統(tǒng)中,主要有三種遠(yuǎn)程調(diào)試方法,分別適用于不同場(chǎng)合的調(diào)試工作:用ROM Monitor調(diào)試目標(biāo)機(jī)程序、用KGDB調(diào)試系統(tǒng)內(nèi)核和用gdbserver調(diào)試用戶空間程序。這三種調(diào)試方法的區(qū)別主要在于,目標(biāo)機(jī)遠(yuǎn)程調(diào)試stub的存在形式的不同,而其設(shè)計(jì)思路和實(shí)現(xiàn)方法則是大致相同的。
           
            而我們最常用的是調(diào)試應(yīng)用程序。就是采用gdb+gdbserver的方式進(jìn)行調(diào)試。在很多情況下,用戶需要對(duì)一個(gè)應(yīng)用程序進(jìn)行反復(fù)調(diào)試,特別是復(fù)雜的程序。采用GDB方法調(diào)試,由于系統(tǒng)資源有限性,一般不能直接在目標(biāo)系統(tǒng)上進(jìn)行調(diào)試,通常采用gdb+gdbserver的方式進(jìn)行調(diào)試。Gdbserver在目標(biāo)系統(tǒng)中運(yùn)行,gdb則在宿主機(jī)上運(yùn)行。
           
            要進(jìn)行GDB調(diào)試,目標(biāo)系統(tǒng)必須包括gdbserver程序,宿主機(jī)也必須安裝gdb程序。一般linux發(fā)行版中都有一個(gè)可以運(yùn)行的gdb,但開(kāi)發(fā)人員不能直接使用該發(fā)行版中的gdb來(lái)做遠(yuǎn)程調(diào)試,而要獲取gdb的源代碼包,針對(duì)arm平臺(tái)作一個(gè)簡(jiǎn)單配置,重新編譯得到相應(yīng)gdb.gdb的源代碼包可以從http://ftp.cs.pu.edu.tw//sourceware/gdb/releases/下載,最新版本為gdb-6.4.下載到某個(gè)目錄,筆者下載到自己的用戶目錄:/home/vicky.下載完后,進(jìn)入/home/vicky目錄,配置編譯步驟如下:#tar jxvf gdb-6.4-tar-bz2 #cd gdb-6.4 #./configure ——target=arm-linux ——prefix=/usr/local/arm-gdb -v #make(這一步的時(shí)候可能會(huì)有問(wèn)題,提示一個(gè)函數(shù)中(具體函數(shù)名不記得了)parse error,就是unsigned前邊多了一個(gè)“}”,你用vi進(jìn)入那一行把它刪掉就行了。)
           
            #make install #export PATH=$PATH:/usr/local/arm-gdb進(jìn)入gdbserver目錄:#./configure ——target=arm-linux –host=arm-linux #make CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc(這一步要指定arm-linux-gcc的位置,可能跟你的不一樣)
           
            沒(méi)有錯(cuò)誤的話就在gdbserver目錄下生成gdbserver可執(zhí)行文件,把它燒寫(xiě)到flash的根文件系統(tǒng)分區(qū),或通過(guò)nfs mount的方式都可以。只要保證gdbserver能在開(kāi)發(fā)板上運(yùn)行就行。
           
            下面就可以用gdb+gdbserver調(diào)試我們開(kāi)發(fā)板上的程序了。在目標(biāo)板上運(yùn)行g(shù)dbserver,其實(shí)就是在宿主機(jī)的minicom下,我的red hat linux裝在vmware下的。我是在minicom下#mount 192.168.2.100:/ /tmp后做的(這里參數(shù)-o nolock可以不加,不加這一步執(zhí)行得反而更快些),hello和gdbserver都是位于linux根目錄下,把主機(jī)根目錄掛在到開(kāi)發(fā)板的/tmp目錄下。
           
            要進(jìn)行g(shù)db調(diào)試,首先要在目標(biāo)系統(tǒng)上啟動(dòng)gdbserver服務(wù)。在gdbserver所在目錄下輸入命令:(minicom下)
           
            #cd /tmp #./gdbserver 192.168.2.100:2345 hello 192.168.2.100為宿主機(jī)IP,在目標(biāo)系統(tǒng)的2345端口開(kāi)啟了一個(gè)調(diào)試進(jìn)程,hello為要調(diào)試的程序。
           
            出現(xiàn)提示:Process /tmp/hello created: pid=80 Listening on port 2345(另一個(gè)終端下)
           
            #cd / #export PATH=$PATH:/usr/local/arm-gdb/bin #arm-linux-gdb hello(gdb) target remote 192.168.2.223:2345(192.168.2.223為開(kāi)發(fā)板IP)

          出現(xiàn)提示:Remote debugging using 192.168.2.223:2345 [New thread 80] [Switching to thread 80] 0x40002a90 in ??()
           
            同時(shí)在minicom下提示:Remote debugging from host 192.168.2.100(gdb)
           
            連接成功,這時(shí)候就可以輸入各種gdb命令如list、run、next、step、break等進(jìn)行程序調(diào)試了。
           
            以上針對(duì)通過(guò)nfs mount和tftp的方式,只能在主機(jī)上調(diào)試好后下載到開(kāi)發(fā)板上運(yùn)行,如果有錯(cuò)誤要反復(fù)這個(gè)過(guò)程,繁瑣不說(shuō),有些程序只能在開(kāi)發(fā)板上調(diào)試。所以筆者采用了gdbserver的遠(yuǎn)程調(diào)試方式。希望對(duì)大家調(diào)試程序有用!

          linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)

          pid控制相關(guān)文章:pid控制原理


          linux相關(guān)文章:linux教程




          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();