[問題] 遠端GDB

看板C_and_CPP (C/C++)作者 (東逼)時間12年前 (2013/11/14 10:54), 編輯推噓5(5041)
留言46則, 3人參與, 最新討論串1/1
開發平台(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
可以轉asm問問其它高手~ 那邊嵌入式高手蠻多的~
11/14 17:35, 1F

11/14 17:37, , 2F
我都用 keil 的 uVision 不熟。
11/14 17:37, 2F

11/14 18:55, , 3F
第 70 行 gdbserver 192.168.0.101:1234 testqt core
11/14 18:55, 3F

11/14 18:56, , 4F
那個 core 是 testqt 的參數 ?
11/14 18:56, 4F

11/14 18:57, , 5F
第 80 行 arm-linux-gdb testqt core
11/14 18:57, 5F

11/14 18:58, , 6F
這個 core 是 gdb 的參數, 指到 core 檔.
11/14 18:58, 6F

11/14 19:00, , 7F
第 119 行之前, 已經可 bt , list 了, 不需用到 target remote
11/14 19:00, 7F

11/14 19:01, , 8F
第 120 行, (gdb) target remote:192.168.0.102 連到遠端,
11/14 19:01, 8F

11/14 19:02, , 9F
其實遠端還沒開始執行, 請接著打 start 啟動它...
11/14 19:02, 9F

11/14 19:04, , 10F
就跟本機(非arm-linux)的 gdb program 後, 要先打 start 一樣.
11/14 19:04, 10F

11/14 19:10, , 11F
或著直接打 run, 直接執行, 看它跑到死掉... :P
11/14 19:10, 11F

11/14 19:53, , 12F
先感謝yvb大~不過我剛剛試了似乎還是不行耶@@ 錯誤如下:
11/14 19:53, 12F

11/14 19:54, , 13F
在執行 /Space/arm/rootfs/arm-linux-gdb testqt core後
11/14 19:54, 13F

11/14 19:54, , 14F
我先只打 set sysroot /Space/arm/rootfs/ 再info之後可看到
11/14 19:54, 14F

11/14 19:55, , 15F
相關library被載入~還未執行接下來的target remote前試著用
11/14 19:55, 15F

11/14 19:58, , 16F
bt,list都不行 bt會出現#0 0x2bede6b0 in internal_fnmatch(
11/14 19:58, 16F

11/14 19:58, , 17F
from .... 還有Cannot access memory at address 0x7e8a810c
11/14 19:58, 17F

11/14 19:59, , 18F
而list則是一樣出現/work/build/.build/src...
11/14 19:59, 18F

11/14 20:00, , 19F
執行 target remote 後再打start會出現unsupport command...
11/14 20:00, 19F

11/14 20:03, , 20F
打了continue後再bt 是有說哪個.so有問題~但和在機器上使用
11/14 20:03, 20F

11/14 20:03, , 21F
gdb時所看到的不太一樣@@照理說遠端的應該要跟機器上一樣吧?
11/14 20:03, 21F

11/15 00:16, , 22F
訊息不大完整, 看不出來是怎麼回事...
11/15 00:16, 22F

11/15 00:18, , 23F
話說你在 #1IWWLAJz (LinuxDev) 用的是 gdb 7.2,
11/15 00:18, 23F

11/15 00:18, , 24F
怎麼這邊又變成 gdb 7.6.1 ??
11/15 00:18, 24F

11/15 00:20, , 25F
用 LinuxDev 那邊的小程式, 測試 gdb 7.6.1 的結果正常嗎?
11/15 00:20, 25F

11/15 00:21, , 26F
另外, 編成 ubuntu 本機用的版本, 裝一下本機的 gdbserver,
11/15 00:21, 26F

11/15 00:22, , 27F
在 ubuntu 本機上跑 gdbserver 並用 gdb 對本機 remote debug,
11/15 00:22, 27F

11/15 00:23, , 28F
可以試試看結果又是怎樣, 當做輔助對照一下...
11/15 00:23, 28F

11/15 00:24, , 29F
另外, 你上面推文寫的兩種當然不一樣, 第一種是用 core 追踪
11/15 00:24, 29F

11/15 00:25, , 30F
程式死掉時的情況; 第二種則是 gdbserver 先把程式讀進來,
11/15 00:25, 30F

11/15 00:27, , 31F
連 ld.so 都還沒開始. 用 start 或 run 才開始啟動執行程序.
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
第 282-287 行的參數問題, 其實在上一段的三、四樓, 我就提到,
11/16 00:33, 32F

11/16 00:34, , 33F
那個 core 是 testqt 的參數了.
11/16 00:34, 33F

11/16 00:37, , 34F
另外, remote 後來試了一下, 確實不能用 start 和 run,
11/16 00:37, 34F

11/16 00:38, , 35F
大概之前直接在設備上用 gdb 記錯了...
11/16 00:38, 35F

11/16 00:39, , 36F
不過 remote 還是可以設中斷點 b main 後再 c 繼續,
11/16 00:39, 36F

11/16 00:41, , 37F
應該就可以 info shared 了; bt, list 在此時應該也可以...
11/16 00:41, 37F

11/16 00:52, , 38F
是的~感謝yvb大 我剛開始看到還以為您是指Qt的參數 囧
11/16 00:52, 38F

11/16 00:54, , 39F
其實我本來以為可以跟在機器上一樣讀取core檔~但看起來不行
11/16 00:54, 39F

11/16 12:14, , 40F
第 340 行的 0x00000000 in ?? (), 在我這邊的情況是,
11/16 12:14, 40F

11/16 12:18, , 41F
把 libthread_db.so 放到 sysroot 下的 lib, 執行 gdb 時,
11/16 12:18, 41F

11/16 12:20, , 42F
set solib-absolute-prefix (同 set sysroot) 到 sysroot,
11/16 12:20, 42F

11/16 12:24, , 43F
結果就會顯示 0x######## in main() at ... 參考一下.
11/16 12:24, 43F

11/16 12:25, , 44F
至於 remote 不能用 core 檔, 反正可以 remote get core core,
11/16 12:25, 44F

11/16 12:27, , 45F
把 core 從設備抓來主機. 可能解析 core 需要額外的處理,
11/16 12:27, 45F

11/16 12:29, , 46F
而且 core 已保留死掉時的情況, 所以就不特別支援了吧.
11/16 12:29, 46F
文章代碼(AID): #1IX3jWVO (C_and_CPP)
文章代碼(AID): #1IX3jWVO (C_and_CPP)