1. 程式人生 > >Windows下通過ARM目標板上的gdbserver進行遠程調試的方法

Windows下通過ARM目標板上的gdbserver進行遠程調試的方法

gdbserver armv4t CodeSourcery

因某種需要,要在Windows平臺上進行程序開發,目標板是基於Micrel芯片(ARMv4t)做的,上面運行有Linux最小系統,只有最基本的命令,需要在Windows平臺上交叉編譯能在ARMv4t上運行的目標代碼,並且還要能進行遠程調試。基於這些需求,初步計劃按以下步驟進行: 1、先在Windows平臺上交叉編譯一個簡單的C語言程序,並上傳到開發板上,能正常運行即可; 2、交叉編譯gdbserver,並上傳到開發板; 3、進行遠程調試。 按上述計劃,首先要找一個Windows環境下的交叉編譯環境,參考了http://www.veryarm.com/arm-none-linux-gnueabi-gcc 下載了arm-2011.03-41-arm-none-linux-gnueabi.exe Windows安裝版(個人感覺在Windows下用安裝版比較好,解壓版需要設定PATH),安裝成功後,用C寫了一個簡單的Hello,World!,使用如下命令進行編譯:

arm-none-linux-gnueabi-gcc hello.c -o hello
目標板與Windows主機通過以太網和串口進行連接,以太網用來上傳文件,串口用於進行終端訪問。目標板與Windows主機使用tfpt進行文件傳遞。Windows上運行有tftp server,如下圖:
技術分享圖片
通過串口終端在目標板上運行如下命令下載Windows主機上編譯的hello程序:
tftp -gr hello 10.32.2.10
使用命令chmod 755 hello添加執行權限後執行時,出現下述錯誤提示:
Illegal Instruction
這說明程序能運行,但指令不對,這有可能是在Windows上交叉編譯時沒有指定具體目標架構的原因(在Ubuntu下使用上述命令進行交叉編譯的程序可以正常執行)。為了解決這個問題,首先通過串口終端查看了目標板啟動時的信息,了解到ARM芯片是armv4t架構,接著使用arm-none-linux-gnueabi-gcc --target-help

查看交叉編譯器支持的ARM架構類型,發現該命令通過-march=option可以指定目標類型,於是,編譯命令改為:
arm-none-linux-gnueabi-gcc -march=armv4t hello.c -o hello -g
編譯成的程序在目標機上能夠運行!(運氣不錯)
第一步完成,接下來交叉編譯gdbserver。先前安裝的arm-2011.03-41-arm-none-linux-gnueabi.exe包含有在Windows下運行的arm-none-linux-gnueabi-gdb.exe命令,要進行遠程調試,需要在目標板上運行gdbserver。於是上gdb官網(http://ftp.gnu.org/gnu/gdb)下載gdb7.6的代碼。突然一想,既然arm-2011.03-41-arm-none-linux-gnueabi.exe包含有Windows上執行的gdb,那是不是也包含有在Linux上運行行的gdbserver呢?進入安裝目錄一搜索,Bingo,果然有,在安裝目錄CodeSourcery\Sourcery_G++_Lite\arm-none-linux-gnueabi\libc\armv4t\usr\bin下,運氣不錯。把該目錄下的gdbserver放到目標版上後,果真能運行。第二步完成(俺有時還是比較懶的,在Windows下就不再自己編譯了)
第三步就相對容易了,在目標板上運行命令啟動gdbserver:
./gdbserver 10.32.2.80:3333 hello
上述命令中的IP是目標板自己的IP地址,端口號自己指定,只要不沖突就行,後面的hello是包含調試信息的被調試程序。然後在Windows下運行arm-none-linux-gnueabi-gdb.exe,進入gdb提示符後後,執行target remote 20.32.2.80:3333就聯上目標板的gdbserver了,然後再在gdb提示符下執行file hello,這個是在Windows下加載被調試的程序,之後就按gdb的命令設置端點等就可以調試了。

Windows下通過ARM目標板上的gdbserver進行遠程調試的方法