在VIM中使用GDB調試 – 使用pyclewn

:help pyclewn

在前面的文章中介紹了使用vimgdb在vim中調試程序,這種方法容許在終端中的vim,以及圖形化的gvim中調試你的程序。不過它的侷限也是很明顯的:首先,它須要給vim的源代碼打補丁並從新編譯vim;另外,它只能在Linux下使用,不能在windows上進行gdb調試。 php

要想在vim中調試,除了使用vimgdb外,還可使用clewn和pyclewn,這兩個工具也是vimgdb的做者提供的,用法基本相同。區別在於,clewn是使用C語言編寫的,而pyclewn是使用python語言編寫的,具備更好的跨平臺能力。本文主要介紹pyclewn工具。 python

使用pyclewn須要計算機上安裝有python 2.4(或以上版本)以及gvim 7.0或以上版本。需注意的是,pyclewn只能與gvim配合使用,它不支持終端中的vim(clewn也是如此) (update 2011/12/27: 在vim 7.3中,最新的pyclew已經支持終端中的vim調試)。另外,gvim在編譯時須要使能netbeans_intg特性和autocmd特性。 linux

若是上面的條件都已經知足,到http://sourceforge.net/projects/pyclewn/下載pyclewn,下載後解壓準備安裝。安裝pyclewn很簡單,在個人計算機上,gvim安裝目錄在個人HOME目錄,所以,也把pyclewn安裝在HOME目錄,使用以下命令: vim

cd /home/easwy/download/pyclewn-0.7/
vimdir=$HOME/.vim python setup.py install --home=$HOME

在pyclewn的源碼目錄中有一個名爲INSTALL的文件,介紹瞭如何在UNIX以及windows上安裝pyclewn,你能夠根據本身的環境決定如何安裝pyclewn。 windows

安裝完pyclewn後,啓動gvim,執行:help pyclewn命令,就能夠看到pyclewn的幫助文件,裏面有不少有用的信息。 ruby

下面經過一個例子講解一下如何使用pyclewn進行調試。例子中所調試的程序在這裏下載:調試程序下載 bash

首先啓動pyclewn。啓動pyclewn的辦法很簡單,在一個終端中執行下面的命令就能夠了: 服務器

pyclewn

pyclewn啓動時,它會啓動一個gvim窗口,咱們的調試將在這個gvim窗口中進行。運行pyclewn的終端將作爲gdb的控制終端,所調試程序的輸入輸出都會經過這個終端進行(固然,你也能夠在gdb中經過tty命令更改控制終端)。 app

接下來,咱們在pyclewn所打開的gvim窗口中輸入下面的命令,編譯該程序,打開要調試的文件,並在文件中設置斷點: 編輯器

:cd pyclewn-ex
:make
:e main.c
:Cfile factorial
:Cbreak 14

前面三條命令是標準的vim命令,切換到示例程序所在目錄,編譯該程序,並打開文件main.c。後面兩條命令以大寫字母C作爲起始,這是pyclewn自定義的命令,pyclewn將會把字母C後的命令內容傳遞給GDB調試器。因此上面兩條命令至關於在GDB中執行file factorbreak 14,加載factor作爲被調試的程序,並在main.c的第14行設置一個斷點。

在執行pyclewn自定義的C命令時,pyclewn會在gvim中分隔出一個窗口,用於顯示GDB調試器的輸入輸出。因此,執行完上面命令後,屏幕看起來是這樣的:

在上面已經設置好斷點了,如今就能夠開始調試了。pyclewn已經定義了一些調試相關的鍵映射,咱們能夠經過下面的命令加載這些鍵映射:

:Cmapkeys

執行完這條命令,會在clewn_console中打印出所定義的鍵映射,我在此再也不贅述。在下面的調試過程當中,我也會使用幾個最經常使用的映射。

咱們繼續調試。我在上面已經定義了一個斷點,因此直接按SHIFT-R鍵運行程序。程序運行到斷點後會停下來,而後咱們連按三次CTRL-N,執行三條語句,如今切換到控制終端,能夠看到程序在等待輸入,咱們輸入一個數字,而後按回車。如今看到的屏幕是這樣的:

在上面的抓圖中,咱們把鼠標移動到變量n上,能夠看到彈出了一個小氣泡,顯示變量n的值爲4,這和咱們輸入的數字是一致的。

接下來再按一次CTRL-N向下執行一個語句,而後再按SHIFT-S步進到函數factorial()中,如今gvim會打開文件util/factorial.c。而後用下面的命令,把變量t和i加入到watch窗口中:

:Cdbgvar t
:Cdbgvar i

上面的命令會建立一個名爲(clewn)_dbgvar的緩衝區,不過此緩衝區並未顯示出來。用下面的命令能夠新建一個窗口顯示此緩衝區:

:sb (clewn)_dbgvar

如今屏幕看起來是這樣的:

按一次SHIFT-C使程序運行至結束,咱們的調試也就告一段落了。

從上面的調試過程能夠看出,使用pyclewn調試很方便。並且,使用pyclewn也能夠在windows上進行調試,不過我沒有試過,有興趣的朋友能夠試一下。在windows上調試,可能須要使用cygwin中所帶的gdb。

若是以爲pyclewn缺省所設置的鍵映射不能知足本身的需求,也能夠本身定義更多GDB調試鍵映射,方法是把pyclewn發行目錄中的.clewn_keys.gdb拷貝到你的HOME目錄,而後修改此文件定製本身的鍵綁定便可。

cd /home/easwy/download/pyclewn-0.7/
cp runtime/.clewn_keys.gdb $HOME

要想了解更多關於pyclewn的使用,請閱讀pyclewn的幫助手冊::help pyclewn

 

————————————————————————————————————

http://easwy.com/blog/archives/tag/debug/

在之前的文章中,Easwy介紹瞭如何使用pyclewn在gvim中調試。網友yorker留言詢問如何在vim中遠程調試服務器上的程序而不須要登陸服務器。這就涉及到遠程調試的話題了。

所謂遠程調試,顧名思義,就是在本地調試運行在遠端設備上的程序。遠程調試在嵌入式系統的開發上應用的比較多。嵌入式設備上內存、磁盤空間都比較有限,可能沒法容納整個gdb的調試環境和符號表;即使能夠容納,也須要對gdb進行交叉編譯,比較麻煩,因此更經常使用遠程調試的辦法。像網友yorker這樣在本地調試遠端服務器上的程序,也是一種應用。

遠程調試最簡單的辦法是使用gdbserver。gdbserver是一個很是小的程序,大小不到100K,所以能夠方便的拷貝到嵌入式設備上,交叉編譯也很簡單。使用gdbserver,就可使你的程序與遠端的GDB調試器通信,接收並執行調試命令。

gdbserver在大多數Linux系統中已經包含,不須要特別安裝。若是你須要交叉編譯,到GNU GDB網站上下載gdb的源代碼,在裏面你能夠找到gdbserver。

本文將主要介紹如何在vim使用pyclewn進行遠程調試(關於pyclewn的介紹,參見Easwy的的另一篇文章:vim使用進階: 在vim中進行GDB調試 – 使用pyclewn)。實際上,本文中所涉及的命令都是經常使用的遠程調試命令,你能夠直接使用gdb或ddd來執行這些命令,進行遠程調試。

咱們還使用在pyclewn一文中的程序作爲調試示例,對那個程序作了一點修改,原來該程序須要由標準輸入讀取一個數字,如今則改成由命令行參數中傳入。修改後的程序在這裏下載。

如今咱們準備開始調試。咱們把編譯好的二進制程序拷貝到一個名爲Easwy_remote的計算機,而後在Easwy_remote上執行:

gdbserver Easwy_local:333 ./factorial 4

上面的命令執行完後,屏幕輸出以下(你的輸出可能稍有不一樣):

Process ./factorial created; pid = 7532
Listening on port 333

上面的gdbserver命令的含義是:使用gdbserver啓動./factorial程序,並傳入參數4,而gdbserver監聽在333端口上,等待遠程GDB程序中的鏈接。命令中的Easwy_local代表容許來自主機Easwy_local的鏈接,不過目前的gdbserver版本其實是不檢測所鏈接的主機的。

如今,咱們在Easwy_local主機上啓動pyclewn,並在所打開的gvim窗口中執行下面的命令:

:e main.c
:Cmapkeys
:Cfile factorial
:Cbreak 15
:Ctarget remote Easwy_remote:333
:Ccontinue

上面的命令,首先打開main.c文件,而後執行pyclewn提供的mapkeys命令,加載pyclewn的按鍵映射。而後使用file命令加載所要調試的程序,並在main.c的第15行設置一個斷點。

須要注意的是target remote命令。這條命令告訴GDB鏈接到主機Easwy_remote的333端口,進行調試。執行完這條命令,咱們就鏈接到了遠端運行的程序。接下來就能夠像調試本地程序那樣進行調試了,在上面Easwy使用的continue命令,使程序執行到斷點處,而後繼續調試。

下面是遠程調試的屏幕抓圖:

gdbserver不只能夠像本文中這樣啓動一個調試進程,它還能夠鏈接到一個已經運行的進程上對其進行調試,例如,用gdbserver Easwy_local:333 –attach 1235命令就可使gdbserver鏈接到進程ID爲1235的進程。

更多關於vi的內容,請參見Easwy的博客上的其它文章。

Posted in 嵌入系統, 開源軟件, 文本處理 | Tagged Vim, 調試 | 1 Reply

vi/vim使用進階: 在VIM中使用GDB調試 – 使用vimgdb

<< 返回vim使用進階: 目錄

本節所用命令的幫助入口:

:help vimgdb

在UNIX系統最初設計時,有一個很是重要的思想:每一個程序只實現單一的功能,經過管道等方式把多個程序鏈接起來,使之協同工做,以完成更強大的功能。程序只實現單一功能,一方面下降了程序的複雜性,另外一方面,也讓它專一於這一功能,把這個功能作到最好。就好像搭積木同樣,每一個積木只提供簡單的功能,但不一樣的積木壘在一塊兒,就能搭出大廈、汽車等等複雜的東西。

從UNIX系統(及其變種,包括Linux)的命令行就能夠看出這一點,每一個命令只專一於單一的功能,但經過管道、腳本等把這些命令揉合起來,就能完成複雜的任務。

vi/vim的設計也聽從這一思想,它只提供了文本編輯功能(與Emacs的大而全恰好相反),並且正如你們所看到的,它在這一領域作的是如此的出色。

也正由於如此,vim自身並不提供集成開發環境所需的所有功能(它也不許備這樣作,vim只想成爲一個通用的文本編輯器)。它把諸如編譯、調試這樣功能,交給更專業的工具去實現,而vim只提供與這些工具的接口。

咱們在前面已經介紹過vim與編譯器的接口(即quickfix),vim也提供了與調試器的接口,這一接口就是netbeans。除此以外,還能夠給vim打一個補丁,以使其支持gdb調試器。

因爲netbeans接口只能在gvim中使用,而使用vimgdb補丁,不管在終端的vim,仍是gvim,均可以調試。因此我更喜歡打補丁的方式,我首先介紹這種方法。

打補丁的方式,須要從新編譯vim,恰好借這個機會,介紹一下vim的編譯方法。我只介紹Linux上編譯方法,若是你想在windows上編譯vim,能夠參考這篇文檔:Vim: Compiling HowTo: For Windows

[ 下載vim源代碼 ]

首先咱們須要下載vim的源碼。到vim主頁下載當前最新的vim 7.1的源代碼,假設咱們把代碼放到~/install/目錄,文件名爲vim-7.1.tar.bz2。

[ 下載vimgdb補丁 ]

接下來,咱們須要下載vimgdb補丁,下載頁面在:

http://sourceforge.net/project/showfiles.php?group_id=111038&package_id=120238

在這裏,選擇vim 7.1的補丁,把它保存到~/install/vimgdb71-1.12.tar.gz。

[ 打補丁 ]

運行下面的命令,解壓源碼文件,並打上補丁:

cd ~/install/
tar xjf vim-7.1.tar.bz2
tar xzf vimgdb71-1.12.tar.gz
patch -d vim71 --backup -p0 < vimgdb/vim71.diff

[ 定製vim的功能 ]

缺省的vim配置已經適合大多數人,但有些時候你可能須要一些額外的功能,這時就須要本身定製一下vim。定製vim很簡單,進入~/install/vim71/src文件,編輯Makefile文件。這是一個註釋很好的文檔,根據註釋來選擇:

  • 若是你不想編譯gvim,能夠打開–disable-gui選項;
  • 若是你想把perl, python, tcl, ruby等接口編譯進來的話,打開相應的選項,例如,我打開了–enable-tclinterp選項;
  • 若是你想在vim中使用cscope的話,打開–enable-cscope選項;
  • 咱們剛纔打的vimgdb補丁,自動在Makefile中加入了–enable-gdb選項;
  • 若是你但願在vim使用中文,使能–enable-multibyte–enable-xim選項;
  • 能夠經過–with-features=XXX選項來選擇所編譯的vim特性集,缺省是–with-features=normal
  • 若是你沒有root權限,能夠把vim裝在本身的home目錄,這時須要打開prefix = $(HOME)選項;

編輯好此文件後,就能夠編輯安裝vim了。若是你須要更細緻的定製vim,能夠修改config.h文件,打開/關閉你想要的特性。

[ 編譯安裝 ]

編譯和安裝vim很是簡單,使用下面兩個命令:

make
make install

你不須要手動運行./configure命令,make命令會自動調用configure命令。

上面的命令執行完後,vim就安裝成功了。

我在編譯時打開了」prefix = $(HOME)」選項,所以個人vim被安裝在~/bin目錄。這時須要修改一下PATH變量,以使其找到我編輯好的vim。在~/.bashrc文件中加入下面這兩句話:

PATH=$HOME/bin:$PATH
export PATH

退出再從新登陸,如今再敲入vim命令,發現已經運行咱們編譯的vim了。

[ 安裝vimgdb的runtime文件 ]

運行下面的命令,解壓vimgdb的runtime文件到你的~/.vim/目錄:

cd ~/install/vimgdb/
tar zxf vimgdb_runtime.tgz –C~/.vim/

如今啓動vim,在vim中運行下面的命令以生成幫助文件索引:

:helptags ~/.vim/doc

如今,你可使用」:help vimgdb「命令查看vimgdb的幫助了。

至此,咱們從新編譯了vim,併爲之打上了vimgdb補丁。下面我以一個例子來講明如何在vim中完成」編碼—編譯—調試」一條龍服務。

[ 在vim中調試 ]

首先確保你的計算機上安裝了gdb ,vimgdb支持5.3以上的gdb版本,不過最好使用gdb 6.0以上的版本。

我使用下面這個簡單的例子,來示例一下如何在vim中使用gdb調試。先來看示例代碼:

文件~/tmp/sample.c內容以下,這是主程序,調用函數計算某數的階乘並打印:

/* ~/tmp/sample.c */
#include <stdio.h>
extern int factor(int n, int *rt);

int main(int argc, char **argv)
{
    int i;
    int result = 1;

    for (i = 1; i < 6; i++)
    {
        factor(i, &result);
        printf("%d! = %d\n", i, result);
    }

    return 0;
}

文件~/tmp/factor/factor.c內容以下,定義了子函數factor()。之因此把它放到子目錄factor/,是爲了演示vimgdb能夠根據調試位置自動打開文件,無論該文件在哪一個目錄下:

/* ~/tmp/factor/factor.c */
int factor(int n, int *r)
{
    if (n <= 1)
        *r =  n;
    else
    {
        factor(n - 1, r);
        *r *= n;
    }

    return 0;
}

Makefile文件,用來編譯示例代碼,最終生成的可執行文件名爲sample。

# ~/tmp/Makefile
sample: sample.c factor/factor.c
gcc -g -Wall -o sample sample.c factor/factor.c

假設vim的當前工做目錄是~/tmp(使用」:cd ~/tmp「命令切換到此目錄)。咱們編輯完上面幾個文件後,輸入命令」:make「,vim就會根據Makefile文件進行編譯。若是編譯出錯,vim會跳到第一個出錯的位置,改完後,用」:cnext「命令跳到下一個錯誤,以此類推。這種開發方式被稱爲quickfix,咱們已經在劍不離手 – quickfix一文中講過,再也不贅述。

如今,假設已經完成連接,生成了最終的sample文件,咱們就能夠進行調試了。

vimgdb補丁已經定義了一些鍵綁定,咱們先加載這些綁定:

:run macros/gdb_mappings.vim

加載後,一些按鍵就被定義爲調試命令(vimgdb定義的鍵綁定見」:help gdb-mappings「)。按<F7>能夠在按鍵的缺省定義和調試命令間切換。

好了,咱們如今按空格鍵,在當前窗口下方會打開一個小窗口(command-line窗口),這就是vimgdb的命令窗口,能夠在這個窗口中輸入任何合法的gdb命令,輸入的命令將被送到gdb執行。如今,咱們在這個窗口中輸入」gdb「,按回車後,command-line窗口自動關閉,而在當前窗口上方又打開一個窗口,這個窗口是gdb輸出窗口。如今vim的窗口布局以下(我又按空格打開了command-line窗口):

小技巧: command-line窗口是一個特殊的窗口,在這種窗口中,你能夠像編輯文本同樣編輯命令,完成編輯後,按回車,就會執行此命令。你要重複執行某條命令,能夠把光標移到該命令所在的行,而後按回車便可;你也能夠對歷史命令進行修改後再執行。詳見」:help cmdline-window「。

接下來,在command-line窗口中輸入如下命令:

cd ~/tmp
file sample

這兩條命令切換gdb的當前工做目錄,並加載咱們編譯的sample程序準備調試。

如今使用vim的移動命令,把光標移動到sample.c的第7行和14行,按」CTRL-B「在這兩處設置斷點,而後按」R「,使gdb運行到咱們設置的第一個斷點處(「CTRL-B「和」R「都是gdb_mappings.vim定義的鍵綁定,下面介紹的其它調試命令相同)。如今vim看起來是這樣:

斷點所在的行被置以藍色,並在行前顯示標記1和2代表是第幾個斷點;程序當前運行到的行被置以黃色,行前以」=>」指示,代表這是程序執行的位置(顯示的顏色用戶能夠調整)。

接下來,咱們再按」C「,運行到第2個斷點處,如今,咱們輸入下面的vim命令,在右下方分隔出一個名爲gdb-variables的窗口:

:bel 20vsplit gdb-variables

而後用」v「命令選中變量i,按」CTRL-P「命令,把變量i加入到監視窗口,用一樣的方式把變量result也加入到監視窗口,這裏能夠從監視窗口中看到變量i和result的值。

如今咱們按」S「步進到factor函數,vim會自動打開factor/factor.c文件並標明程序執行的位置。咱們再把factor()函數中的變量n加入到監視窗口;而後按空格打開command-line窗口,輸入下面的命令,把變量*r輸入到變量窗口:

createvar *r

如今,vim看起來是這樣的:

如今,你能夠用」S「、」CTRL-N「或」C「來繼續執行,直至程序運行結束。

若是你是單步執行到程序結束,那麼vim最後可能會打開一個彙編窗口。是的,vimgdb支持彙編級的調試。這裏咱們不用進行彙編級調試,忽略便可。

若是你發現程序有錯誤,那麼能夠按」Q「退出調試(gdb會提示是否退出,回答y便可),而後修改代碼、編譯、調試,直到最終完成。在修改代碼時,你可能並不喜歡vimgdb的鍵映射(例如,它把CTRL-B映射爲設置斷點,而這個鍵又是經常使用的翻頁功能),你能夠按<F7>取消vimgdb的鍵映射,或者你直接修改gdb_mappings.vim文件中定義的映射。

看,vim + gdb調試是否是很簡單?!

咱們能夠再定製一下,使調試更加方便。

打開~/.vim/macros/ gdb_mappings.vim文件,在」let s:gdb_k = 0「這一行下面加上這段內容:

" easwy add
if ! exists("g:vimgdb_debug_file")
    let g:vimgdb_debug_file = ""
elseif g:vimgdb_debug_file == ""
    call inputsave()
    let g:vimgdb_debug_file = input("File: ", "", "file")
    call inputrestore()
endif
call gdb("file " . g:vimgdb_debug_file)
" easwy end

在」let s:gdb_k = 1「這一行下面加上這段內容:

" easwy add
call gdb("quit")
" end easwy

註釋掉最後一行的」call s:Toggle()「。

而後在你的vimrc中增長這段內容:

""""""""""""""""""""""""""""""
" vimgdb setting
""""""""""""""""""""""""""""""
let g:vimgdb_debug_file = ""
run macros/gdb_mappings.vim

如今,在啓動vim後,按<F7>,就進入調試模式以及設定調試的鍵映射。在第一次進入調試模式時,會提示你輸入要調試的文件名,之後就沒必要再輸入了。再按一次<F7>,就退出調試模式,取消調試的鍵映射。

利用vim的鍵映射(map)機制,你能夠把你喜歡的gdb命令映射爲vim的按鍵,方便多了。映射的例子能夠參照~/.vim/macros/ gdb_mappings.vim。

再附上一張抓圖,這是使用putty遠程登陸到linux上,在終端vim中進行調試。這也是我爲何喜歡vimgdb的緣由,由於它能夠在終端vim中調試,而clewn只支持gvim:

由於我不常使用gdb調試,因此本文僅舉了個簡單的例子,以拋磚引玉。歡迎你們共享本身的經驗和心得。

我在文章vimgdb調試時的常見問題及解決中列出了一些常見問題及其解決方法,但願對你們有幫助。

最後,讓咱們感謝vimgdb做者xdegaye的辛勤勞動,咱們後續文章會介紹pyclewn,這是vim與gdb結合的另一種形式,它和vimgdb同屬一個項目。

相關文章
相關標籤/搜索