[問題] 遠端GDB
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux Ubuntu
Arm開發版
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
Qt
問題(Question):
大家好
是這樣子的~
我最近正在學用GDB來debug我的程式
我故意寫了一支執行起來時會當掉的Qt程式想要用GDB來觀察
在機器上使用時都沒啥問題 (版本為6.6)
可以使用list、break、bt都沒問題
現在我想試著使用遠端GDB
爬了網路的做法
不外乎是要在機器上安裝gdbserver、在本機安裝arm-linux-gdb
這些都沒有問題
甚至我遠端GDB一支小程式也都可以
不過當我想要利用遠端GDB去看我這隻會當掉的Qt程式時
結果卻連一些基本指令都無法使用
看了一下訊息發現似乎連library都無法載入
百思不得其解~因此上來請教大家
先講一下我的設定:
本機ip: 192.168.0.101
機器ip:192.168.0.102
機器的root file system掛在本機的 /Space/arm/rootfs
gdbserver、arm-linux-gdb版本為7.6.1,安裝在本機的 /Space/arm/rootfs/home/gdb
Qt程式當掉時有產生core檔
以下是我的作法
在機器上:
/home/gdb/gdbserver 192.168.0.101:1234 testqt core
此時會出現
Process testqt created; pid = ...
Listening on port 1234
這時我在本機上輸入
/Space/arm/rootfs/home/gdb/arm-linux-gdb testqt core
在開始遠端前我先設定sysroot、solib等資訊
(gdb) set sysroot /Space/arm/rootfs/
(gdb) set solib-absolute-prefix /Space/arm/rootfs/lib:/Space/arm/rootfs/usr/lib
:/Space/arm/rootfs/usr/local/Qt/lib
(gdb) set solib-search-path /Space/arm/rootfs/lib:/Space/arm/rootfs/usr/lib
:/Space/arm/rootfs/usr/local/Qt/lib
為了確定我想要的lib都有載進來
我用了 info sharedlibrary查詢
From To Syms Read Shared Object Library
0x2abcf65c 0x2ac16d6c Yes (*)
/Space/arm/rootfs/usr/local/Qt/lib/libQtOpenGL.so.4.8.4
0x2ad55abc 0x2b2ebf54 Yes (*)
/Space/arm/rootfs/usr/local/Qt/lib/libQtGui.so.4.8.4
0x2b4592fc 0x2b5010dc Yes (*)
/Space/arm/rootfs/usr/local/Qt/lib/libQtNetwork.so.4.8.4
0x2b57b318 0x2b6f7ecc Yes (*)
/Space/arm/rootfs/usr/local/Qt/lib/libQtCore.so.4.8.4
0x2ab3e560 0x2ab4b5c0 Yes (*)
/Space/arm/rootfs/usr/lib/libz.so.1.2.3
.....
看起來的確是有被載入
接著我輸入 (gdb) target remote:192.168.0.102
可以看到機器上的確有出現 Remote debugging from host 192.168.0.101
神奇的是這時候我再打一次 info sharedlibrary
From To Syms Read Shared Object Library
0x2aaab780 0x2aac3838 Yes /Space/arm/rootfs/lib/ld-2.13.so
剛剛被載入的資訊居然都沒了 @@
即使我再重新輸入一次也都沒東西
打其他指令bt、list...也只會出現警告訊息
像是
(gdb) bt
#0 0x2aaabd40 in _start () from /Space/arm/rootfs/lib/ld-2.13.so
#1 0x00000000 in ?? ()
(gdb) list
1 /work/build/....(一長串東西)/..
/gcc/config/arm/lib1funcs.asm:
No such file or directory.
百思不得其解~
查了一下網路~也有人說是指定路徑的問題
但我已經有指定路徑了也還是不行
不知道是不是哪裡搞錯了
想了很久都不懂
所以就來這裡請教大家了
在此也先謝謝大家的回覆囉
--
▍ ▍ ╯╰ ╯╰ ◢◣ ◢◣ 我最愛的 柏柏龍~ 柏柏龍~
◢██◣ ╮╭ ▎▎╮╭ ▎▎ 柏柏龍~ 柏柏龍~
⊙ ⊙ ◢ ◣ ⊙ ⊙ ◣ 人人心中都有柏柏龍~
≡ ▼ ≡ ▲▲ ● ● ≡ ▼ ≡ ■ ■ ■ ■ 憤怒就永遠不會消失~
皿 ◢⊙⊙◣ ≡皿 ≡ 皿 炸是最美的擁有~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.179.30
推
11/14 17:35, , 1F
11/14 17:35, 1F
→
11/14 17:37, , 2F
11/14 17:37, 2F
推
11/14 18:55, , 3F
11/14 18:55, 3F
→
11/14 18:56, , 4F
11/14 18:56, 4F
→
11/14 18:57, , 5F
11/14 18:57, 5F
→
11/14 18:58, , 6F
11/14 18:58, 6F
→
11/14 19:00, , 7F
11/14 19:00, 7F
→
11/14 19:01, , 8F
11/14 19:01, 8F
→
11/14 19:02, , 9F
11/14 19:02, 9F
→
11/14 19:04, , 10F
11/14 19:04, 10F
→
11/14 19:10, , 11F
11/14 19:10, 11F
→
11/14 19:53, , 12F
11/14 19:53, 12F
→
11/14 19:54, , 13F
11/14 19:54, 13F
→
11/14 19:54, , 14F
11/14 19:54, 14F
→
11/14 19:55, , 15F
11/14 19:55, 15F
→
11/14 19:58, , 16F
11/14 19:58, 16F
→
11/14 19:58, , 17F
11/14 19:58, 17F
→
11/14 19:59, , 18F
11/14 19:59, 18F
→
11/14 20:00, , 19F
11/14 20:00, 19F
→
11/14 20:03, , 20F
11/14 20:03, 20F
→
11/14 20:03, , 21F
11/14 20:03, 21F
推
11/15 00:16, , 22F
11/15 00:16, 22F
→
11/15 00:18, , 23F
11/15 00:18, 23F
→
11/15 00:18, , 24F
11/15 00:18, 24F
→
11/15 00:20, , 25F
11/15 00:20, 25F
→
11/15 00:21, , 26F
11/15 00:21, 26F
→
11/15 00:22, , 27F
11/15 00:22, 27F
→
11/15 00:23, , 28F
11/15 00:23, 28F
→
11/15 00:24, , 29F
11/15 00:24, 29F
→
11/15 00:25, , 30F
11/15 00:25, 30F
→
11/15 00:27, , 31F
11/15 00:27, 31F
先感謝yvb大與damody大的幫忙
經過這兩天的摸索~大概有點心得
整理一下po上來~
希望也可以幫到以後有類似問題的人
如果講錯或觀念不對還請多指教囉
事情的起因是這樣子的
為了測試遠端GDB是否可行
我寫了一支用純C語法的程式
在機器上測試時沒啥問題
但是在遠端GDB時就一直有問題
(也就是我在linuxDev版發文問的那篇)
查了一下網路
似乎是跟版本有關係
於是我分別檢查了機器和主機的GDB版本
發現分別是6.6與7.2
因此我又重新抓了gdb-7.2的source code來編譯
編譯安裝好了之後遠端GDB這支小程式就沒問題
但是當我改用遠端GDB一支Qt小程式之後
發現無法順利gdb
info sharedlibrary發現似乎是沒辦法載入相關library
即使我使用set sysroot、set solib等方法似乎都還是不行
找了一下文章發現有人說gdb-7.4以前的用sysroot似乎會有問題
所以乾脆就改用7.6的了
當然改用了之後還是一樣有問題 所以我就來po這篇文了 囧
anyway這兩天自己試試看
才算是找到問題 @@
原來是因為我的Qt程式是有帶參數的
但是我在GDB時沒把他加入
所以才會一直無法執行
修改後的做法是:
(在機器上)
/home/gdb/gdbserver 192.168.0.101:1234 testqt -platform eglfs
↑Qt執行檔名 ↑要帶的參數
(在主機)
/Space/arm/rootfs/home/gdb/arm-linux-gdb testqt
(gdb) set sysroot /Space/arm/rootfs/
→此時會開始載入相關library
(gdb) target remote 192.168.0.102:1234
→此時可在機器上看到 Remote from ...
(gdb) c (因為遠端沒有start or run指令,所以改用continue)
→此時可看到執行檔正常開始執行時會出現的訊息,直到跑到當掉的地方
(gdb) bt
→此時本機會顯示掛在哪裡
ex:
#0 xxxxxx....
#1 xxxxxx... ← 一堆提示訊息
#2 xxxxxx...
這時候就可以知道是在哪個.so出錯了~要知道更細節前提當然是編譯要加入 -g選項 XD
最後總結一下目前我知道的問題:
1.不能使用list
→正確來說要能使用list,除非能在當初編譯相對應的位置有source code
ex1:在機器上list我的那支純C小程式會沒有東西,但是透過遠端GDB就可以
因為當初這支小程式就是在本機上編的
ex2:在機器上和本機都無法使用list來看Qt程式,因為Qt lib都不是在這兩者環境編的
2.無法用遠端GDB來看core dump
→查了一下好像是遠端GDB本來就無法使用 @@
3.出現#2 0x00000000 in ?? ()
→似乎是代表進入main()之前就有問題了
需要檢查 #0、#1的提示訊息來看是怎麼回事
以上是我大概的心得
不過感覺不是很確定
所以如果我說錯或觀念錯誤的
也在請大家不吝指教了 囧
謝謝大家
※ 編輯: donby 來自: 59.120.179.30 (11/15 18:13)
※ 編輯: donby 來自: 59.120.179.30 (11/15 18:15)
推
11/16 00:33, , 32F
11/16 00:33, 32F
→
11/16 00:34, , 33F
11/16 00:34, 33F
→
11/16 00:37, , 34F
11/16 00:37, 34F
→
11/16 00:38, , 35F
11/16 00:38, 35F
→
11/16 00:39, , 36F
11/16 00:39, 36F
→
11/16 00:41, , 37F
11/16 00:41, 37F
→
11/16 00:52, , 38F
11/16 00:52, 38F
→
11/16 00:54, , 39F
11/16 00:54, 39F
推
11/16 12:14, , 40F
11/16 12:14, 40F
→
11/16 12:18, , 41F
11/16 12:18, 41F
→
11/16 12:20, , 42F
11/16 12:20, 42F
→
11/16 12:24, , 43F
11/16 12:24, 43F
→
11/16 12:25, , 44F
11/16 12:25, 44F
→
11/16 12:27, , 45F
11/16 12:27, 45F
→
11/16 12:29, , 46F
11/16 12:29, 46F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章
13
22