Hi35xx NVR GDB調試
1. 下載gdb源碼
嵌入式Linux
的GDB 調試環境由Host
和Target
兩部分組成,Host
端使用arm-linuxgdb,Target
Board 端使用gdbserver。這樣,應用程序在嵌入式目標系統上運行,而gdb
調試在Host
端,所以要採用遠程調試(remote)的方法。進行GDB
調試,目標系統必須包括gdbserver
程序(在主機上正對硬件平臺編譯成功後下載到目標機上),宿主機也必須安裝GDB
程序。一般Linux
發行版中都有一個可以運行的GDB,但開發人員不能直接使用該發行版中的GDB
來做遠程調試,而要獲取GDB
的源代碼包,針對arm
平臺作一個簡單配置,重新編譯得到相應GDB。GDB
的源代碼包可以從
http://www.gnu.org/software/gdb/download/
http://ftp.gnu.org/gnu/gdb/ 211.95.105.202:3128
可以上去的,所有的版本都有啊
http: //ftp.cs.pu.edu.tw/linux/sourceware/gdb/releases/下載
ftp://ftp.gnu.org/gnu/gdb
外網的ftp
我經常上不去,國內常見的開源社區的下載頻道通常都有下載的
http://download.chinaunix.net/download/0004000/3482.shtml,
我下載的版本gdb-7.10.tar.gz。下載到某個目錄,如/opt。
參考資料:gdb+gdbserver 方式進行ARM 板上程序調試 http://blog.csdn.net/hejianhua/article/details/7312979
XML:
http://blog.csdn.net/yangzhongxuan/article/details/13002789
2.配置編譯環境
1) 解壓gdb源碼tar zxvf gdb-7.10.tar.gz -C /opt/
2) 進入到gdb源碼目錄,cd /opt/gdb-7.10
3) 配置編譯環境,交叉編譯工具鏈爲海思交叉工具編譯鏈,我配置的交叉編譯器爲v400的arm-hisiv400nptl-linux
4)詳細編譯步驟
1、./configure --target=arm-hisiv400nptl-linux --prefix=/opt/hisi-gdb/ -v
(--target 配置gdb 的目標平臺, --prefix 配置安裝路徑, 當然其他路徑也可以, .跟下面配置一致即可,須在環境變量中聲明, 啓動arm-hisiv400nptl-linux-gdb 需要, 打開
vi /etc/profile , 添加export PATH=$PATH:/opt/hisi-gdb, source ./etc/profile使配置生效)
配置完成後生成makefile
2、make
make install
生成arm-hisiv400nptl-linux-gdb,並存入/opt/hisv-gdb
/bin
3、安裝完成後進入cd /opt/gdb-7.10/gdb/gdbserver
./configure --target=arm-hisiv400-linux
--host=arm-hisiv400-linux
--target=arm-hisiv400-linux表示目標平臺,
--host 表示主機端運行的是arm-hisiv400-linux-gdb
make
生成gdbserver
3.代碼加-g編譯。
在代碼路徑下E:\my_code\his3520d_v2-8-0-8_3536\Build進入到Build目錄下,打開Rules.mak文件進行修改。
定義debug = 1 編譯代碼,注意可執行文件生成路徑。Debug版本編譯生成的可執行文件和release版本生成的可執行文件路徑不同。在out文件夾下面例如Hi3536: (\Out\Hi3536\app)目錄下會生成一個debug的文件夾,debug版本生成的可執行程序存放在此文件夾下面。
4.將gdb源碼編譯好的可執行程序gdb ,gdbserver拷貝到掛載路徑下。
板端運行命令:
#./gdbserver 192.168.1.141:2345 vfware
(命令格式 #. /gdbs er v er 主機I P: 端口號 程序)
出現提示:
Process borad created; pid = 776
Listening on port 2345
Remote debugging from host 192.168.1.141
在ubuntu下運行命令:
在主機上運行arm-hisiv400-linuxnptl-gdb,注意這個gdb是用源碼編譯出來的,在安裝路徑/opt/hisiv-gdb/bin路徑下。
在主機端運行gdb
#. /gdb
(gdb)target remote 192.168.1.143:2345
(命令格式target remote 開發板I P:端口號 (和板子上運行gdbserver 的端口號要相同))
詳細調試步驟請看上面文檔(gdb+gdbserver 方式進行ARM 板上程序調試.pdf)
#(gdb)C 執行程序
當代碼出現段錯誤,輸入bt 來查看堆棧信息跟蹤問題出現錯誤所在位置。
5. Core文件調試方法
編譯上面的gdb和gdbserver後,同樣拷貝gdb和gdbserver到掛載目錄,
執行命令ulimit -c 10000000000 設置臨時core文件的大小爲無窮大,注意每次重新運行程序都要設置
然後執行./gdb vfware core (vfware 爲調試程序,也是加-g 編譯出來的程序,注意libuv庫中有用到clock_gettime()、clock_getres()函數,加-g編譯時會報未定義錯誤,所以編譯時還要加 -lrt, 才能成功編譯debug版本)
程序如果產生段錯誤Segmentation fault. 會在當前掛載路徑下產生一個core文件。
執行完./gdb vfware core後出現如下信息
使用命令bt查看當前堆棧的信息,既出現錯誤的地方
注意:
可能會出現下面這種情況
#0 0x7bf99014 in ?? ()
#1 0x7bf020f8 in ?? ()
看不到堆棧的信息,只有地址和問號。我們可以看到上面的提示信息
意思是有5個共享庫的函數找不到,我們把板子上的庫拷貝到掛載目錄即可
cp /lib/ /mnt/nfs -rf /lib爲目標板上的庫文件夾 /mnt/nfs 爲掛載目錄