2012/08/24

VIM: 使用 pyclewn 遠端除錯 C++ 程式

[pyclewn] 是一套可以用 vim 當做 front-end,gdb or pdb 當做 back-end 的 debugger。相較於同類型的玩具可以參考 clewn、vimgdb、GdbFromVim。之前我是用 cgdb 或是 clewn 這套,今天上官網上看到他推薦 pyclewn 便抓來試試,才發現就易用性來說它真的很不錯。

因為目前我的環境都需要用 remote debugger,所以就順道帶過。

安裝 pyclewn


請先在官網上抓 pyclewn*.tar.gz 後,解壓縮,再用

sudo python setup.py install

安裝即可,如要將 vim plugin 安裝到特定資料匣可在 vimdir 的環境變數

sudo vimdir=/home/dorowu/src/gdb/pyclewn-vim/ python setup.py install

跑跑跑...


1. 在 target 上使用 gdbserver 執行 ./Boxee 並在 port 1234 等待 gdb 連線

# gdbserver 0.0.0.0:1234 ./Boxee 
Process ./Boxee created; pid = 9787
Listening on port 1234

2. 在 host 上的 gvim 裡 gvim

:Pyclewn                           " 開啟 pyclewn
:C target remote 172.16.5.8:1234   " 連線到 gdbserver,172.16.5.8 為 target ip
:C symbol-file ./Boxee             " 載入 symbol file
:C b main                          " 在 main 函式設斷點
:C continue                        " 讓程式繼續執行

各位可以發現若要執行 gdb command 可直接用 prefix C 後接 gdb command 即可。

3. pyclewn 提供了一些快速鍵,要使用這些快速鍵時請先 :Cmapkyes。取消快速鍵為 :Cunmapkeys

CTRL-Z  send an interrupt to gdb and the program it is running (unix
                only)
        B       info breakpoints
        L       info locals
        A       info args
        S       step
        CTRL-N  next: next source line, skipping all function calls
        F       finish
        R       run
        Q       quit
        C       continue
        W       where
        X       foldvar
        CTRL-U  up: go up one frame
        CTRL-D  down: go down one frame

cursor position: ~
        CTRL-B  set a breakpoint on the line where the cursor is located
        CTRL-E  clear all breakpoints on the line where the cursor is located

mouse pointer position: ~
        CTRL-P  print the value of the variable defined by the mouse pointer
                position
        CTRL-X  print the value that is referenced by the address whose
                value is that of the variable defined by the mouse pointer
                position

4. 關閉 pyclewn 請用 :nbclose
5. 其它功能可參考 [官方文件]

Screenshot


下圖顯示了 pyclewn 的一些功能,像是

1. 滑鼠指到的變數會查詢內容
2. 你會有一個 gdb 視窗 (但是你不能直接編輯,請用 :Cgdbcommand)
3. 你的 QuickFix 會列出所有的中斷點