Pages

Tuesday, January 29, 2008

gdb-mode

最近因為在 cgdb 中處理有 standard input 的程式有點問題 (遇到要輸入的地方就會停住@@)。雖然原始的 gdb 是正常的,但習慣看到 source code 後就不太想回頭一直 list,試著轉移到 emacs 的 gdb-mode 後發現還蠻方便的,所以就試著使用看看。

gdb-mode 整合了大部份 debugger 的功能,透過一個 buffer 來操作 gdb,同時開啟一個 buffer 顯示 source code。雖然 emacs 的指令有很多討厭的 prefix,所幸透過 gud 的處理,大部份 gdb 上的指令與使用習慣都可以直接搬過來,使用上沒什麼太大的困難。就目前提到的部份,跟 cgdb 做的事幾乎一樣,但 gdb-mode 給的更多,幾乎是一個很完整的整合界面了。

要體驗 gdb-ui 首先可以看看 EmacsWiki 上提供的 screen shot。啟用了 gdb-many-windows 後會在原本的 frame 新增四個 window,包括 gud window、local window、backtrace window 與 breakpoint window。除此之外也可以打開 memory window、registry window 與 thread window。我個人習慣在 console emulator 中作業,除了沒辦法多開 frame 外,window layout 是一樣的。不過我覺得預設把 gud window 放在上面很不習慣,只是 elisp 還不太熟,等到有能力修改再來調整。

雖然 gdb-mode 已經很方便了,但就我自己的使用上還是有一些小缺點:

  • gud buffer 沒有 command history 的功能 (按方向鍵的上下會移動 windows 中的游標),但直接按 enter 一樣會執行前一次指令 (這跟原始的 gdb 是一樣的)
  • 有些功能綁了滑鼠動作,不支援 console 環境操作。例如 memory window,雖然比 x 指令方便,但設定 start address 與 repeat count 只能透過 mouse event 來觸發變更的函式 (預設情況是這樣,但我相信可以寫幾個 elisp 函式來解決)
  • 設定 memory window 的 start address 時,address expression 似乎不是很彈性,只能設定固定位址,我猜是因為必須將位址儲存在一個變數中,所以沒辦法每次重新計算 (最後還是回頭用 display...)

但整體來說還是比 cgdb 方便一些,轉換上也沒有什麼困難 (假設對於 vi 或 emacs 的基本操作都有一定程度的熟悉...)。昨天看到 jserv 的 HappyGDB 簡報中包含幾個 gdb frontend 的介紹,卻漏了 emacs 上的整合界面,所以在這裡分享一下自己的使用心得,有方便的設定也歡迎指教 :D (其實還漏了 DDD,這東西也蠻有趣的...不過不是本文重點XD)

最後要抱怨一下 debian 奇怪的 policy。我原本裝的是 emacs22-nox 版本,為了測試 memory window 的功能想裝 emacs22-gtk,卻要求我要移除 emacs22-nox:

The following packages will be REMOVED: emacs22-nox The following NEW packages will be installed: emacs22-gtk

但我平常都在 -nox 版本工作,不可能完全改用 -gtk 版本。後來只好把 deb 檔抓下來解開,直接把執行檔放到 /usr/bin。也許有什麼選項可以抑制相依性檢查吧 (透過 set-selection 關掉?),不過 debian 不是我主要使用的 distro,所以沒有花很多研究 apt 的行為,可以運作比較重要。


This article was originally posted on this site.

2 comments:

  1. 缺點 2 解決;缺點 3 似乎需要再確認。總之再玩一陣子看看 :p

    ReplyDelete
  2. 缺點1解決:參考 emacs 文件的 Shell History Ring 一節,透過 M-p 跟 M-n 來取得輸入過的指令

    另外,如果需要送 SIGINT 得用 C-c C-c

    ReplyDelete