星期五, 5月 12, 2006

Use gdbserver and gdb - remote debugging

  • target端要build gdbserver,host端要有cross version 的gdb,我用arm-elf-gdb 和uClinux附的gdb server。
  • build program時,compile option要加上 -g 選項,加入debug information。
  • build時,要build出兩個file : target execution和for debug。
    target debug的可以strip symbol,也可以不strip。
    for debug的不能strip。也不能用elf2flt轉為flat format。要維持elf format。
  • target 上run gdbserver,同時指定 host端的ip: port number,還有要load的程式:
    #gdbserver 10.3.5.123:2345 testprog
    process testprog created; pid = 130
    Listening on port 2345

    如果testprog 有argument ,直接寫在test prog後面,例如:

    #gdbserver 10.3.5.123:2345 testprog -o -v 123
  • host 端啟動arm-elf-gdb,並且load 測試程式的symbol (.gdb)
    arm-elf-gdb testprog.gdb
    (gdb)
  • 在host端,指定target作remote debugging..
    (gdb) target remote 10.3.5.123:2345
    Remote debugging using 10.3.5.123:2345
    0x93880050 in _start( )
  • OK,雙方連線完成,可以開始由arm-elf-gdb 控制target的動作了(作debug)。

因為gdb的source listing是以"行數"為參數,所以最好再用vi 開啟debug的source code,同時用
:set nu
將line numner on,這樣就可以看到source code的line number了。

這時候,用vi 瀏覽到要設定break-point的地方,看看行數是多少,再在gdb 下b linenumber 命令設定段點:
 (gdb) b 1302    --- 在1302 行 設斷點


接著用 c (continue) command 繼續執行
(gdb) c

到達break point時,他會自動停下來。
用step 執行一行指令,
用next 執行到下一行。
用clear 清除breakpoint。
用list 列出目前code的source code。
用q結束。

另外,如果有X的化,可以用gdb的圖形介面 - ddd。
用ddd作remote , cross-platform debug時,要指定debugger
#ddd --debugger arm-elf-gdb  testprogram.gdb &
會開啟ddd gui。畫面下方式debug command ,上面是source list。
一樣,在debug command下target command
(gdb)targe remote 10.3.123:2345

6 則留言:

小春 提到...

求教一下:PATH 裡已有/usr/local/arm/arm-linux/bin:..
我做出GDB ./configure --target=arm-linux-prefix=/usr/local/arm-gdb
-host=i586-linux
GDB Server ./configure --target=arm-linux --host=arm-linux

然後兩邊連結起來,出現了 list沒問題
但是一用Step 跑就會出現 0x400... in ? () from /lib/ld-linux.so.2
(gdb)
case1:...
which has no line numbet information 卡死..
Case2:嘗試 set solib-absolute-prefix ../arm-linux/lib
in _start() at rtld.c:-1
-1 rtld.c: No search file or d
case3:

基本上我大概在一開始configure的時候沒有設定GDB的lib路徑 實在不知道要改甚麼了...
能不能救救我啊

keith.sun@gmail.com

checko 提到...

No Line No.
會不會是build 的時候沒有加上 -g 選項 ?

小春 提到...

-g 是一定有下的,畢竟-static沒問題
沒load file ok (GDB)c finished
haved set solib-absolute-prefix
set solib-search-path
$(my arm path)
ok!

在於有load symbol時
file testp 之後
again
I Can run
but>>
USING host libthread_db library "/lib/libthread_db.so.1".

(gdb) c
Program exited normally.

I still not got right LD,and mapping target shared library
any possible configure and

arm-linux-gcc -g gdb_test.c -o $(OUT_ARM)/arm_gt

我想應該問題在我沒有讓host上的file
在 compiler時期 有用到$(TARGET)/lib
compiler step could fixed error?
目前還在try nostdlib的方式

小春 提到...

終於解決了,我換了 GDB 6.7.1
是OK的。

..XD建議不要用 GDB6.6
凸 好久

還好不用在makefile 下奇怪的 nostdlib
不然還有一堆東西要bind在一起。

謝謝啦。

checko 提到...

哇,你真厲害 :)

匿名 提到...

你好,我目前在arm-elf-gdb遇到一些瓶頸,上網google找解答的時候,正好找到此一blog,不曉得方不方便向你提問,謝謝你。

我目前遇到的問題是,當我在用arm-elf-g++在編譯時,一定要加入-elf2flt.ld -elf2flt這兩個選項,才可以編譯成功,不加入的話,就會出現錯誤,可是加入的話,又會和你在blog上所說的有所衝突,請問要如何解決呢,謝謝你。

網誌存檔