星期五, 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 則留言:

  1. 求教一下: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

    回覆刪除
  2. No Line No.
    會不會是build 的時候沒有加上 -g 選項 ?

    回覆刪除
  3. -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的方式

    回覆刪除
  4. 終於解決了,我換了 GDB 6.7.1
    是OK的。

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

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

    謝謝啦。

    回覆刪除
  5. 哇,你真厲害 :)

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

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

    回覆刪除