我要用codeblocks交叉編譯和調試arm開發板上的程序,宿主機是ubuntu12.04.開發板是嵌入式linux操作系統。
1、配置交叉編譯環境
由上到下,1處直接選擇即可。2處是你交叉編譯器安裝位置,3 4 5 6 可以在你交叉編譯器安裝位置下的bin目錄找到,arm-linux-gdb默認是不安裝的,需要我們自己安裝,安裝arm-linux-gdb和gdbserver需要另外安裝(如果沒有安裝的話),arm-linux-gdb安裝目錄最好也選擇為交叉編譯器安裝目錄。即/usr/local/arm/arm-linux-4.4.3。
2、arm-linux-gdb和gdbserver安裝方法
注:arm-linux-gdb的安裝路徑是/usr/local/arm/arm-linux-4.4.3
arm-linux-gdb的編譯安裝
下載gdb-6.8.tar.bz2至工作目錄
gdb源碼下載:http://ftp.gnu.org/gnu/gdb/
命令如下:
$tar -jxvf gdb-6.8.tar.bz2
$cd gdb-6.8
$./configure --target=arm-linux --enable-sim --prefix=/usr/local/arm/arm-linux-4.4.3
--prefix用於指定安裝路徑
$make
$sudo make install
完成后可以在/usr/local/arm/arm-linux-4.4.3/bin下找到arm-linux-gdb文件
arm-linux-gdbserver的編譯安裝
進入./gdb/gdbserver
命令如下:
$cd gdb/gdbserver./configure --target=arm-linux --host=arm-linux
$make CC=arm-linux-gcc
(CC=arm-linux-gcc用於指定arm-linux編譯器)
編譯成功后在當前目錄下會生成gdbserver文件,拷貝至開發板上(可放入開發板/usr/bin/目錄下,這樣在任何目錄下均可執行gdbserver命令)
3、配置nfs文件共享。
(1)sudo apt-get install nfs-kernel-server
sudo apt-get install portmap nfs-common
Ubuntu 上默認是沒有安裝 Ubuntu nfs 服務器的,因此我們首先安裝 Ubuntu nfs 服務器端:
$sudo apt-get install nfs-kernel-server
在一些文檔中,提出還需要使用 apt-get 來手動安裝 nfs 的客戶端 nfs-common,以及端口映
射器 portmap,但其實這是沒有必要的,因為在安裝 nfs-kernel-server 時,apt 會自動為我們把它們安裝好。
(2)sudo vim /etc/exports
加入這么一行:
/home/somebody/nfs_root/rootfs_mini/ *(rw,sync,no_root_squash)
(/home/somebody/nfs_root/rootfs_mini/ 是我的根文件系統所在的位置)
Ubuntu nfs 允許掛載的目錄及權限在文件/etc/exports 中進行了定義。
例如,我們要將根目錄下的 rootfs 目錄共享出來,那么我們需要在/etc/exports 文件末尾添加
如下一行:/rootfs *(rw,sync,no_root_squash)
其中: /rootfs 是要共享的目錄, *代表允許所有的網絡段訪問, rw 是可讀寫權限,sync 是資料
同步寫入內存和硬盤,no_root_squash 是 Ubuntu nfs 客戶端分享目錄使用者的權限,如果客
戶端使用的是 root 用戶,那么對於該共享目錄而言,該客戶端就具有 root 權限。
其它 Ubuntu nfs 常用的參數有:
ro 只讀訪問
rw 讀寫訪問 sync 所有數據在請求時寫入共享
async nfs 在寫入數據前可以響應請求
secure nfs 通過 1024 以下的安全 TCP/IP 端口發送
insecure nfs 通過 1024 以上的端口發送
wdelay 如果多個用戶要寫入 nfs 目錄,則歸組寫入(默認)
no_wdelay 如果多個用戶要寫入 nfs 目錄,則立即寫入,當使用 async 時,無需此設置。
hide 在 nfs 共享目錄中不共享其子目錄
no_hide 共享 nfs 目錄的子目錄
subtree_check 如果共享/usr/bin 之類的子目錄時,強制 nfs 檢查父目錄的權限(默認)
no_subtree_check 和上面相對,不檢查父目錄權限
all_squash 共享文件的 UID 和 GID 映射匿名用戶 anonymous,適合公用目錄。
no_all_squash 保留共享文件的 UID 和 GID(默認)
root_squash root 用戶的所有請求映射成如 anonymous 用戶一樣的權限(默認)
no_root_squas root 用戶具有根目錄的完全管理訪問權限
anonuid=xxx 指定 nfs 服務器/etc/passwd 文件中匿名用戶的 UID
anongid=xxx 指定 nfs 服務器/etc/passwd 文件中匿名用戶的 GID
(3)
修改掛載點的屬性
chmod 777 /home/somebody/nfs_root/rootfs_mini/
(4)
重啟 nfs
sudo /etc/init.d/nfs-kernel-server restart
sudo /etc/init.d/portmap restart
(5)
在本機上測試
showmount -e
sudo mount -t nfs –o nolock 192.168.2.10:/home/somebody/nfs_root/rootfs_mini/ /mnt/nfs/
ls -l /mnt/nfs/
nfs mount 默認選項包括文件鎖,依賴於portmap提供的動態端口分配功能。
解決方法:kill 文件鎖(lockd)或者mount -o nolock
於是嘗試mount -o nolock -t nfs 192.168.1.24:/home/test /mnt/nfs,正常工作。
nfs mount device or resource busy
這是因為多次掛載的原因,因此要先umount /mnt/nfs 一下 ,如果還是掛載不成功需要重啟開發板來試試。
注:可以通過一個符號鏈接來 export NFS 目錄,但在/etc/exports 下所添加的掛載點應為真
正的目錄。比如建一符號鏈接
ln -s /home/pub/work/freerunner/out/target/product/freerunner /home/jgyang/nfsroot
這樣在開發板上設置的內核命令行中設置的 NFS 目錄就可是:/home/jgyang/nfsroot,但在
/etc/exports 文 件 中 export 出 的 目 錄 應 當 是 實 際 的 NFS 所 在 的 目 錄 , 即
/home/pub/work/freerunner/out/target/product/freerunner。
這樣有兩個好處,一是可以省去開發板中啟動參數命令過長的麻煩;二是在重新編譯 androi之后可以直接使用生成的 NFS,而不必再重新拷貝一份。
4、修改工程的調試屬性
我通過網絡來實現gdb的遠程調試,這樣我需要將宿主機的一個目錄掛載到開發板上,這就是nfs的作用了。選擇什么目錄隨意。掛載/home/project、目錄到開發板的/gdbserver目錄下。然后再宿主機/home/project/目錄下建立工程,修改項目調試屬性。
點擊項目右鍵,點擊屬性。
修改debug的ip地址和端口,端口任意,但是ip地址是開發板的ip地址。這是為了連接開發板的gdbserver而設置的。
這樣設置就基本完成了。可以開始調試了。
5、調試示例
前邊我們已經將gdbserver拷貝到/usr/bin目錄下。所以我們進入掛載目錄/gdbserver運行
gdbserver 192.168.0.232:1111 ./bin/debug/usb 這里ip地址是宿主機的,端口自定,但是要和codeblock一樣。./bin/debug/usb 是指生成的二進制可調試文件。
然后再宿主機開始調試吧,如下圖