10
15

GDB-刺入bug心臟的寶劍

寫這篇文章時突然想起一位很久不見的朋友,他是我工作第一年的夥伴,這位好友令我印象最深刻的是他使用GDB的技巧,那時是我第一次看到process可以被attach,signal可以被攔截...等諸如此類的特技表演,我那位朋友對gdb的熟練度可能比吃飯還高,也多虧他的幫忙,讓我瞭解除了printf以外的其它debug好招

這篇文章主要是示範如何進行遠端除錯,所以請先下載最新版的GDB package version 6.8,我的實驗板是QT2410,toolchain為ELDK(ELDK有內建gdbtui),下載解壓縮完後,請執行下面的shell script,讓編出來的gdb可以support ARM架構,--enable-tui是讓GDB編出圖形化UI debug界面

  1. #! /bin/sh 
  2. ./configure --target=arm-linux \
  3. --prefix=/usr/local/eldk/armgdb \
  4. --exec-prefix=/usr/local/eldk/armgdb \
  5. --enable-tui

編譯完後請到gdb/gdbserver資料夾下執行下面的shell script並編譯

  1. #! /bin/sh 
  2.  
  3. export PATH=$PATH:/usr/local/eldk/usr/bin/
  4. export CPPFLAGS="-I/usr/local/eldk/arm/usr/include" 
  5. export LDFLAGS="" 
  6. export CFLAGS="" 
  7. export AR=arm-linux-ar 
  8. export AS=arm-linux-as 
  9. export LD=arm-linux-ld 
  10. export RANLIB=arm-linux-ranlib 
  11. export CC=arm-linux-gcc 
  12. export NM=arm-linux-nm 
  13. export ARCH=arm 
  14.  
  15. ./configure --target=arm-linux \
  16. --host=arm-linux \
  17. --build=arm-linux-gnu \
  18. --prefix=/usr/local/eldk/armgdb \
  19. --exec-prefix=/usr/local/eldk/armgdb \

這樣子我們可以得到一個可在2410上執行的gdbserver

先寫個簡單的小程式並編譯它(for example:arm-linux-gcc –ggdb –o hello hello.c),把測試程式丟到板子上再鍵入指令gdbserver 192.168.15.1:12345 hello,你會看到如下gdbserver啟動的畫面

在host端開啟我們編譯出來的gdbtui,可看到如下畫面,並輸入以下指令
(1)target remote 192.168.15.1:12345(連接遠端的gdbserver)
(2) continue到第一個中斷點時set solib-search-path /usr/local/eldk/arm/lib/(設定動態連結庫的位置),因為gdb預設的share library位置與target board相同,所以導致GDB will be unable to debug shared library initializers and track explicitly loaded dynamic code.

詳細的gdbserver與gdb用法請參考此篇文章

標籤: embedded
評論: 9 | 引用: 0 | 閱讀: 14717
  • 1 
KunYi [ 2008-10-15 16:18 | 回覆 | 編輯 刪除 ]
小弟受惠良多 這裡真是一個不錯的Blog
希望 Joey 能繼續發揮!!
Joey [ 2008-10-16 09:53 郵箱 | 回覆 | 編輯 刪除 ]
感謝您的支持,小弟其實已經規畫好之後的寫作題目,如frame buffer, embedded GUI, USB ,SD ...等,希望舊友新知能多來這邊晃晃...^0^
ahdeng [ 2008-10-20 14:44 | 回覆 | 編輯 刪除 ]
請問,有無針對kernel的debug方式?
Joey [ 2008-10-21 09:12 郵箱 | 回覆 | 編輯 刪除 ]
Which OS kernel?
ahdeng [ 2008-10-21 09:44 | 回覆 | 編輯 刪除 ]
linux
Joey [ 2008-10-21 09:56 郵箱 | 回覆 | 編輯 刪除 ]
linux without mmu:用一般ICE load vmlinux binary即可進行除錯
linux with mmu:請用printk or kgdb(2.6.27的版本對arm的支援比較完整,不過還不夠好)

不過這幾年出現可以debug linux+mmu的ICE,露天好像有賣
ahdeng [ 2008-11-03 10:49 | 回覆 | 編輯 刪除 ]
該內容只有管理員可見
Joey [ 2008-11-10 09:29 郵箱 | 回覆 | 編輯 刪除 ]
寫MII的driver請多注意linux mii的界面函式
struct mii_phy_def
{
    u32                phy_id;        /* Concatenated ID1 << 16 | ID2 */
    u32                phy_id_mask;    /* Significant bits */
    u32                features;    /* Ethtool SUPPORTED_* defines */
    int                magic_aneg;    /* Autoneg does all speed test for us */
    const char*            name;
    const struct mii_phy_ops*    ops;
};

就算沒用到也要宣告這個structure並指派函式給它...

如果ping不出去,請檢查hard_start_xmit是否下錯command或是沒把封包資料填入正確的register
martin [ 2010-05-28 12:09 | 回覆 | 編輯 刪除 ]
請問一下我在kernel bebug,我有試過 KGDB ,但是我的裝置只有一個 UART,被KGDB佔據了,所以我就看不到printk的log,有什麼方法可以看到printk?另外書上面寫因為KGDB使用簡單的輪詢串列驅動程式,所以串列上傳統的ctrl + c 中斷程序將沒有效果,所以如果一旦我按下ctrl c就只會讓我host端的主機失去對裝置的連線,裝置就會不斷的跑下去,書上面是說建議在sys_sync()下中斷點,然後可以藉由木邊版的一個終端機輸入sync來停止核心進入除錯程式,可是我那唯一的串列負已經被佔據了,要怎麼要用終端機裡輸入sync,我也找不到sys_sync這個函示在我的code裡面,我是用andorid 1.6版的。請問版主知道嗎?感恩~~
  • 1 
發表評論
暱 稱: 密 碼:
網 址: E - mail:
驗證碼: 驗證碼圖片 選 項:
頭 像:
內 容: