1. 程式人生 > >用Qt 呼叫GDB除錯 Arm程式 詳細步驟----可單步執行每一行

用Qt 呼叫GDB除錯 Arm程式 詳細步驟----可單步執行每一行

前言
本人交叉編譯環境 Ubuntu 10.04(虛擬機器),編譯工具鏈 arm-hisiv100nptl-linux,Qt 4.8.5 ,QtCreator1.3.1

1、在虛擬機器Ubuntu 10.04上,安裝GDB除錯工具之前,要安裝預處理模組:
sudo apt-get install texinfo
sudo apt-get install libncurses5-dev
sudo apt-get install m4
sudo apt-get install flex
sudo apt-get install bison

2、安裝GDB除錯工具
2.0 下載gdb-7.4.tar.gz(http://www.gnu.org/software/gdb/download/)

   手動到網頁下載
2.1、將gdb-7.4.tar.gz拷貝到任意的位置
2.2、解壓gdb-7.4.tar.gz
   tar -zxvf gdb-7.4.tar.gz
2.3、編譯arm-linux-gdb(下面/usr/local是安裝目錄,可自行更改)
  到目錄gdb-7.4下
   cd gdb-7.4
   $./configure --target=arm-hisiv100nptl-linux --prefix=/usr/local/arm-gdb -v
   target指明編譯生成的GDB用於除錯ARM-LINUX程式,prefix指明安裝目錄
   $make
   #make install
   #sudo gedit /etc/profile

   export PATH=$PATH:/usr/local/arm-gdb/bin --把arm-linux-gdb加入環境變數
   這樣就可以在/usr/local/arm-gdb/bin目錄下看到如下三個可執行檔案
   arm-hisiv100nptl-linux-gdb
   arm-hisiv100nptl-linux-gdbtui
   arm-hisiv100nptl-linux-run
2.4、編譯GDB Server
   #cd ./gdb/gdbserver   (進入gdb-7.4目錄裡執行該句)
   #export PATH=$PATH:/usr/local/arm-gdb/bin
   #./configure --target=arm-hisiv100nptl-linux


   #make CC=arm-hisiv100nptl-linux-gcc //編譯用於目標機的stub程式生成gdbserver是GDB客戶端程式,在板子上執行。
   此時發現有錯誤,開啟config.h檔案,把相應的行註釋掉:
   //#define HAVA_SYS_REG_H
   //define HAVE_DECL_ADDR_NO_RANDOMIZE 1    
   有的人說只需要註釋一行就可以了,我的需要註釋這兩行
   註釋完後,儲存並關閉config.h,重新執行:
   make clean
   make CC=arm-hisiv100nptl-linux-gcc。成功後會生成可自行程式gdbserver。
2.5、將gdbserver通過你搭建的環境下載到開發板(我的環境是/mnt/nfs/samples),與你的可自行程式放在一個資料夾下

3、以sample_venc為例,構建Qt工程:(我的SDK路徑是:/root/hixx/Hi3520D_SDK_V1.0.3.2/)

3.1、在$SDK_PATH/sample/下建立資料夾,我命名為qt_venc。拷貝$SDK_PATH/sample/venc/sample_venc.c到qt_venc。開啟命令列,進入qt_venc資料夾,執行qmake -project。這樣就自動生成了Qt工程檔案。用QtCreator開啟這個工程檔案qt_venc.pro,把工程檔案修改如下:(注意檔案路徑各人情況不同,請酌情修改)
# #####################################################################
# Automatically generated by qmake (2.01a) ?? 6? 9 16:55:18 2015
# #####################################################################
TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += . \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/include \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/sample/common \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/tw2865 \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/tw2960 \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/tlv320aic31 \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/extdrv/cx26828
DEFINES += hi3520D \
    HICHIP=0x3520D100 \
    HI_DEBUG \
    HI_XXXX \
    DEMO

# Input
SOURCES += sample_venc.c \
    ../common/sample_comm_vpss.c \
    ../common/sample_comm_vo.c \
    ../common/sample_comm_vi.c \
    ../common/sample_comm_venc.c \
    ../common/sample_comm_vdec.c \
    ../common/sample_comm_vda.c \
    ../common/sample_comm_sys.c \
    ../common/sample_comm_audio.c \
    ../common/loadbmp.c

LIBS += /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libmpi.a \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libhdmi.a \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libVoiceEngine.a \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libaec.a \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libresampler.a \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libanr.a \
    /root/hixx/Hi3520D_SDK_V1.0.3.2/mpp/lib/libjpeg.a

CONFIG += debug

########################## pro  檔案結束   ###############


說明:本人的Qt 4.8.5 是交叉編譯過的,因此開啟QtCreator Tools--->Options ,點選Qt4\Qt Versions 可以看到如下圖:
 
從圖上可以看到我的虛擬機器有兩個版本的Qt:Qt4.6.2linux 和Qt4.8.5arm
請確認 Default Qt Version 是不是arm版的Qt,否則編譯的程式無法在板子上執行。

qt_venc.pro檔案生成後,還不能開始編譯,要點一下QtCreator左側的“Projects”按鈕,核實一下編譯設定。我的編譯設定如下圖:
 

發現編譯設定正確,然後就可以編譯qt_venc了

3.2 編譯qt_venc之後,生成目的碼,把它拷貝到開發板。假設開發板IP :172.18.1.178。本人虛擬機器IP:172.18.1.176。除錯qt_venc步驟如下:
     在開發板執行: 
     cd /mnt/nfs/samples  進入工作目錄
     ./gdbserver  172.18.1.176:3333  qt_venc 0  -qws 在開發板啟動除錯服務。其中172.18.1.176是除錯PC的IP,3333是自定的除錯埠qt_venc執行時帶引數0表示4D1錄影;-qws是qt程式在板子上執行必須帶的引數。

    在虛擬機器上QtCreator選單上,選擇Debug ---->Start Debugging ----> Start and Attach to Remote Application,然後出現下圖:
     

QQ圖片20150702095951.png (8.28 KB, 下載次數: 0)

下載附件

2015-7-2 09:59 上傳


    點“OK”
   然後就可以單步除錯了。可以看到斷點、程序、以及變數的Watcher視窗