1. 程式人生 > >【Linux開發】CCS遠端除錯ARM,AM4378

【Linux開發】CCS遠端除錯ARM,AM4378

注意一點:CCS也是安裝在Linux主機上的,不是安裝在Windows上的,我在Windows上做出了很多嘗試,但最終也不沒明白究竟要用怎樣的格式去執行在ARM-Linux應用程式,out檔案ELF可定不行,然後嘗試轉成bin,然後仍然說是格式錯誤!雖然嘗試了遠端連線ARM-Linux板卡,並實現了window-》show view-》Remote Systems可以用來編輯遠端的系統,當然需要UserID和登陸密碼了,還有對應的IP地址,跟利用Qt進行遠端除錯ARM程式一樣,也是通過Ssh、StpFiles等進行的下載程式,可在終端命令中執行類似超級終端的效果,雖然是通過網路連線的。

下面是參考的文章:

       最近需要使用CCSV5使用gdbserver遠端除錯ARM cortex-a8的程式,移植成功gdbserve,使用的版本包是gdb-7.1,主機環境為ubuntu10.04,開發板掛載的nfs檔案系統。CCSV5已經自帶zylincdt,所以只需構建開發板端gdbserver就可以了。下面是詳細過程。

1、gdb下載安裝
下載gdb-7.1.tar.bz2至工作目錄
gdb原始碼下載:http://ftp.gnu.org/gnu/gdb/
命令如下:
$tar -jxvf gdb-7.1.tar.bz2
$cd gdb-7.1
$sudo ./configure --target=arm-none-linux-gnueabi --enable-sim --prefix=/home/ss/develop_environment/gdb7.1
--prefix用於指定安裝路徑
$make
若有錯誤
linux-arm-low.c:61:21: error: sys/reg.h: No such file or directory
make: *** [linux-arm-low.o] 錯誤 1
gdb-7.1/gdb/gdbserver/linux-arm-low.c中:
#ifdef HAVE_SYS_REG_H
//#include <sys/reg.h>  (註釋這一行)
#endif
然後再重新make
$sudo make install

完成後可以在/home/ss/develop_environment/gdb7.1下找到arm-linux-gdb檔案

2、arm-linux-gdbserver的編譯安裝(gdbserver需要用gdb編譯目錄下檔案所以沒有單獨釋出)
進入./gdb/gdbserver
命令如下:
$cd gdb/gdbserver./configure --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi
$make CC=arm-none-linux-gnueabi-gcc
(CC=arm-none-linux-gnueabi-gcc用於指定arm-linux編譯器)
編譯時若出現PATH_MAX undeclared錯誤的解決方法:(大部分不出現)
在hostio.c檔案中增加
#include <linux/limits.h>
原因是巨集PATH_MAX在<limits.h>中沒有定義,而是定義在<linux/limits.h>中
(紅色表示我在編譯時沒有碰到這個錯誤,此錯誤是網友整理的,留在這裡以供以後參考)
編譯成功後在當前目錄下會生成gdbserver檔案,拷貝至開發板上(可放入開發板/usr/bin/目錄下,這樣在任何目錄下均可執行gdbserver命令)

3、這樣編譯出來的gdbserver會有問題:

Remote ‘g’ packet reply is too long “0000000000000000000000000000000000000000000000000000000000000000000000000000000000”
GDB遠端除錯錯誤解決
使用GDB 7.1版本進行遠端除錯時出現:Remote ‘g’ packet reply is too long錯誤,需要修改gdb程式碼解決,辦法是:修改gdb/remote.c檔案,註釋process_g_packet函式中的下列兩行:
//if (buf_len > 2 * rsa->sizeof_g_packet)
//error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);
在其後新增:

if (buf_len > 2 * rsa->sizeof_g_packet) {
    rsa->sizeof_g_packet = buf_len ;
    for (i = 0; i < gdbarch_num_regs (gdbarch); i++) {
        if (rsa->regs->pnum == -1)
        continue;
        if (rsa->regs->offset >= rsa->sizeof_g_packet)
        rsa->regs->in_g_packet = 0;
        else  
        rsa->regs->in_g_packet = 1;
    }     
}

4、gdbserver的使用
要進行gdb除錯,首先要在目標系統上啟動gdbserver服務。在gdbserver所在目錄下輸入命令: 
(minicom下)
#cd /home/root/gcc_test
#gdbserver 10.2.7.22:10000 gcc_test(這裡的gcc_test為在宿主機用arm-none-linux-gnueabi-gcc -d gcc_test.c -o gcc_test編譯後傳過來的)
10.2.7.22為宿主機IP,在目標系統的10000埠(你也可以設其他可用的值,當然必須跟主機的gdb一致)開啟了一個除錯程序,gcc_test為要除錯的程式(必須-g加入除錯資訊)。 
出現提示: 
Process gcc_test created: pid=2130
Listening on port 10000 
(ubuntu10.04下)
#cd /home/ss/workdir/
#export PATH=$PATH:/home/ss/develop_environment/gdb7.1/bin
#arm-none-linux-gnueabi-gdb gcc_test
最後一行顯示:This GDB was configured as “--host=i686-pc-linux-gnu,--target=arm-none-linux-gnueabi”...,如果不一致說明arm-linux-gdb有問題
說明此gdb在X86的Host上執行,但是除錯目標是ARM程式碼。
(gdb) target remote 10.2.7.23:10000
(10.2.7.23為開發板IP)
出現提示: 
Remote debugging using 10.2.7.23:10000
[New thread 3200]
[Switching to thread 3200]
0x40002a90 in ??()
同時在minicom下提示:

Remote debugging from host 10.2.7.22:10000

5、為gdbserver加入多執行緒支援

預設情況gdbserver是不支援多執行緒除錯的,拷貝linux或開發板檔案系統lib目錄下的libpthread.so.0/libpthread-2.11.1.so*和libthread_db.so.1/libthread_db-1.0.so(不同機器庫的版本可能不一致)到交叉編譯環境根目錄的lib庫目錄下。

6、注意:用於CCSV5的arm-none-linux-gnueabi-gdb必須使用第1步編譯安裝的目錄/home/ss/develop_environment/gdb7.1/bin下的,也就是arm-none-linux-gnueabi-gdb出於同一版本包。(除錯詳細過程見博文:TI-Davinci開發系列之五CCS5.2使用gdbserver遠端除錯應用程式》)

        移植成功後CCSV5除錯介面與開發板端互動圖(除錯輸出在gdbserver端,這裡沒有使用minicom)


更詳細的CCSV5與gdbserver的使用請參閱:http://processors.wiki.ti.com/index.php/Linux_Debug_in_CCSv5