實用技巧:Gdbserver遠程調試的具體實現

;采用的是nfs目標板掛載本機目錄的方法 , 當然首先 , 你得開通本機的nfs共享服務 , 具體步驟如下: 1、進入/etc目錄 , vim exports這個文件 , 在里面添加/home 192.168.0.*(rw,sync)保存后退出 注:/home 為要共享的文件夾的名稱 , 192.168.0.*為本NFS服務器允許訪問的客戶端ip , 若nfs不成功 , 后面參數rw ro 等標志對文件夾操作權限 , sync:數據同步寫入內存和硬盤 , 也可以使用async , 此時數據會先暫存于內存中 , 而不立即寫入硬盤 。可以將括號里面的sync去掉 。2、重新啟動nfs服務 , 命令為:/sbin/service nfs restart 3、輸入命令route del default來關閉網關(加快mount速度) 4、mount 192.168.0.47(為本機的ip):/home /mnt用以測試本機是否開通nfs服務 。cd /mnt目錄下 , 看mnt下的內容是否與home的內容一致 , 若一致 , 表明已經開通nfs服務 。當本機的nfs服務開通后 , 你還需要配置開發板的ip地址 , 由于各個開發板ip地址配置方法不一樣 , 所以 , 假設開發板的ip地址為192.168.2.100. 搭建交叉編譯環境的步驟: 1、一般在安裝linux時候 , 自動安裝c編譯環境 , 因此不需要再重新安裝gcc編譯器 。2、安裝交叉編譯器 從ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain/下載交叉編譯器cross-3.2.tar.bz2 , 存放在/usr/local目錄下 。切換致該目錄: # cd /usr/local # mkdir arm 然后解壓cross-3.2.tar.bz2: # tar jxvf cross-3.2.tar.bz2 –C /usr/local/arm 解壓后把/usr/local/arm/usr/local/arm中最后一個arm拷貝到/usr/local , 也就是用命令cd /usr/local/arm/usr/local中 , 用cp -a arm /usr/local把arm拷貝到/usr/local中去 。3、把交叉編譯器的路徑加入到PATH 。(兩種方法a , b) a、# export PATH=$PATH:/usr/local/arm/bin 注:(這只能在當前的終端下才是有效的 , ) b、修改/etc/profile 文件: # vim /etc/profile 增加路徑設置 , 在末尾添加如下: export PATH=$PATH:/usr/local/arm/bin 4、使新的環境變量生效 。# source /etc/profile 5、檢查是否將路徑加入PATH的方法 。# echo $PATH 如果顯示的內容中有/usr/local/arm/bin , 說明已經將交叉編譯器的路徑加入PATH 。自此 , 交叉編譯環境安裝完成 。6、測試 。下面我們就來測試一個簡單的例子 。/*Hello.c*/ #include int main() { printf(“hello word!n”); return 0; } 程序輸好以后確認無誤 , 保存 。進入程序文件所在目錄 # arm-linux-gcc hello.c –o hello (-o 可以理解為“目標為生成”)arm-linux-gcc是第一次出現 , 有人可能會問這個哪里來的 , 不妨打開剛才安裝的交叉編譯工具目錄/usr/local/arm-linux/arm-linux/bin/可以發現里面有一個arm-linux-gcc文件 , 這個就是針對arm的CPU的gcc編譯器了 。以后用其它編譯工具鏈式也可以通過這種方法看看其編譯器是什么了 。編譯好了以后就可以下載到目標機進行測試了 。當然也可以先在PC機上測試正誤 。用gcc hello.c –o hello就可以生成PC機上程序了 , 在運行./hello 就可以發現終端顯示hello!字樣 。用arm-linux-gcc編譯的程序在PC機上是不能運行的 , 運行后給出錯誤報告:無法執行二進制文件 。說明經過交叉編譯環境編譯出的文件是硬件可執行的二進制代碼文件. 7、交叉編譯環境搭建成功 。要經行gdbserver遠程調試 , 還必須安裝gdb遠程調試工具: gdb的源代碼包可以從http: //ftp.cs.pu.edu.tw/Linux/sourceware/gdb/releases/下載 , 最新版本為gdb-6.4 。下載到某個目錄 , 筆者下載到自己的用戶目錄:/home/vicky 。下載完后 , 進入/home/vicky目錄 , 配置編譯步驟如下: #tar jxvf gdb-6.4-tar-bz2 #cd gdb-6.4 #./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v #make (這一步的時候可能會有問題 , 提示一個函數中(具體函數名不記得了)parse error , 就是unsigned前邊多了一個”}”,你用vi進入那一行把它刪掉就行了 。一般都不會出錯的 。) #make install #export PATH=$PATH:/usr/local/arm-gdb 進入gdbserver目錄: #./configure --target=arm-linux –host=arm-linux #make CC=/usr/local/arm/bin/arm-linux-gcc (這一步要指定arm-linux-gcc的位置 , 可能跟你的不一樣) 沒有錯誤的話就在gdbserver目錄下生成gdbserver可執行文件 , 把它燒寫到flash的根文件系統分區 , 或通過nfs mount的方式都可以 。只要保證gdbserver能在開發板上運行就行 。下面就可以用gdb gdbserver調試我們開發板上的程序了 。在目標板上運行gdbserver , 其實就是在宿主機的minicom下 , 我的red hat linux裝在vmware下的 。我是在minicom下#mount 192.168.2.100:/ /tmp后做的(這里參數-o nolock可以不加 , 不加這一步執行得反而更快些) , hello和gdbserver都是位于linux根目錄下 , 把主機根目錄掛在到開發板的/tmp 目錄下 。要進行gdb調試 , 首先要在目標系統上啟動gdbserver服務 。在gdbserver所在目錄下輸入命令: (minicom下) #cd /tmp #./gdbserver 192.168.2.100:2345 hello 192.168.2.100為宿主機IP , 在目標系統的2345端口開啟了一個調試進程 , hello為要調試的程序 。出現提示: Process /tmp/hello created: pid="80" Listening on port 2345 (另一個終端下) #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為開發板IP) 出現提示: Remote debugging using 192.168.2.223:2345 [New thread 80] [Switching to thread 80] 0x40002a90 in ??() 同時在minicom下提示: Remote debugging from host 192.168.2.100 (gdb) 連接成功 , 這時候就可以輸入各種gdb命令如list、run、next、step、break等進行程序調試了 。注:在遠程調試的這些步驟中nfs配置和安裝交叉編譯工具 , 以及安裝gdb工具的沒有什么順序 , 只是主意再gdbserver遠程連接前要配置好開發板的ip地址 。

推薦閱讀