QT Creator 環境使用 remote debug 調試 arm 程序


這里使用的 4.8.5 QTE 環境,之前嘗試過遠程使用 GDB 來調試板子上的 QT 程序,但是沒成功。沒有調試手段比較痛苦,今天又花了點時間,居然搞定了。粗做記錄。

工具版本:

1. QtCreator: 2.4.1 based on Qt4.8.0, 32bit

2. arm-linux-gcc: 4.5.1, 從友善之臂的開發光盤上拿來的

3. GDB: gdb-7.6

4. QTE 4.8.5-32bit: 從友善之臂的光盤上摳來的

5. mint13 (操作可參考 ubuntu12.4)

以下工作,是基於友善之臂的開發環境做的。但是應該主要思路是一致的。如下圖所示,QtCreator 通過調用 arm-linux-gdb ,與開發板上的 gdb-server 通過 TCP/IP 進行通信,協同完成 bin 文件的調試;二者都使用共同的 symbol 庫,QtCreator 負責解析,gdbserver 負責抓取 symbol 和寄存器值。

 

所以,這里需要做的工作就是,需要1)編譯出 arm-linux-gdb 以及 2)gdbserver,還有,配置編譯出針對板子的3)帶 debug 信息的二進制文件。

 

1,2)編譯 gdb

1和2是同一個工作,都是從 gdb 源碼來編譯的,所以,不分開來記錄。

首先,下載並解壓源碼包,得到 gdb 源碼目錄 /tmp/gdb-7.6.

在 /tmp/gdb-7.6 目錄下新建文件夾 __install,做安裝文件拷貝目錄.

執行 autoconf 腳本,使用如下參數:

./configure --target=arm-linux --disable-tui --prefix=/tmp/gdb-7.6/__install/

make -j && make install

此時,在 /tmp/gdb-7.6/__install/ 目錄下,看到有 bin、lib、include 等文件夾。將這 3 個文件夾下的內容拷貝到 toolchain/4.8.5/arm-linux-eabui/ 對應目錄下。

然后,切換目錄到 /tmp/gdb-7.6/gdb/gdbserver/ 下,准備編譯 gdbserver。

執行 autoconf 腳本,使用如下參數:

./configure --target=arm-linux --host=arm-linux --prefix=/tmp/gdb-7.6/__install/server/

make -j&&make install

此時,我們在 /tmp/gdb-7.6/__install/server 下發現 bin 和 share 兩個文件夾。bin 下面,就是我們需要的,在開發板上運行的 gdbserver,拷貝到板子上就行了。

我們可以嘗試用 gdbserver 來運行程序:

$ gdbserver 192.168.1.230:1234 packet_analyzer 
Process packet_analyzer created; pid = 11413
Cannot exec packet_analyzer: Exec format error.

Child exited with status 127
No program to debug.  GDBserver exiting

這是因為這里使用的二進制文件不包含調試信息的緣故,需要編譯帶 debug 信息的二進制文件才能被 gdb 使用。

 

3) 編譯帶調試信息的 arm 二進制文件

我是直接對我的 QtCreator 進行了配置,添加了 QtE 4.8.5 的開發環境 和 arm-linux-4.5.1 的路徑。截圖如下:

添加了工具鏈之后,就可以在工程的 project 頁面下,看到下面的選項,在這里添加 debug-build for ARM。

添加這樣一個 build 選項后,我們就可以點擊 run 生成二進制文件了。

 

4)遠程調試

將二進制文件拷到開發板,並使用 gdbserver 執行二進制文件(remote debuging 部分是因為 qtcreator 連過來之后,才打印的):

# gdbserver 192.168.1.230:1234 packet_analyzer 
Process packet_analyzer created; pid = 11460
Listening on port 1234
Remote debugging from host 192.168.1.243
hi 
hello smvSocket 
Compiling packet filter failed! 
do nothing... 
smvProcess::Open(), Open Smv Socket succeed! 

在代碼中設置斷點。

配置 QtCreator->debug->start debuging->attached to remote debug server... ,並配置如下,點擊 ok 連接到開發板的 gdbserver。

此時,看到 QtCreator 中的代碼停在了 我們設置的斷點處,單步也可以進行。

 

可能還有更方便的方法,待實驗。

 

后續...

今天嘗試了使用 QtCreator 里面的 device 方式打開調試 gdbserver。主要的時間花費在了找合適版本的 openssh 上,先后試了 openssh7.2p2 , openssh5.3p1, openssh5.8p1。。。最后終於,用 openssh5.8p1 中的 sshd 做服務器,可以讓 CtCreator 中的 device 客戶端連接上。就是這個版本的服務器反應有點慢,需要把 timeout 時間拉長一點。

device 的配置是在 options 里面進行的,我的如下:

配置好上面的 device,就可以在 debug->start debuging->start remote debug server... 選項卡,打開下面的界面,選擇你要調試的進程,QtCreator 會自動的通過 ssh 通道調用 /usr/bin/gdbserver,將 gdbserver attach 到要調試的進程上去(通過 pid attach 到進程)。

使用這種方法,我們不用登錄到設備內部,手動調用 gdbserver 去打開程序。。。(感覺好雞肋 囧RZ)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM