這里使用的 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)