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

來源:互聯網
上載者:User

標籤:

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。

 

vim 7.4的如下:

(1)https://github.com/liulong3712/vimgdb-for-vim7.4

(2)

  vim7-4.tar.bz2:ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2

  vimgdb-for-7.4:https://github.com/larrupingpig/vimgdb-for-vim7.4/archive/master.zip

 

  

[ 打補丁 ]

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

cd ~/install/tar xjf vim-7.1.tar.bz2tar xzf vimgdb71-1.12.tar.gzpatch -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非常簡單,使用下面兩個命令:

makemake install 

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

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

make過程中遇到的一個問題:

  (缺少ncurses安裝包

  解決辦法:

  下載安裝相應軟體包

  一、如果你的系統是RedHat系列:

  yum list|grep ncurses

  yum -y install ncurses-devel

  yum install ncurses-devel

 

  二、如果你的系統是Ubuntu或Debian:

  apt-cache search ncurses

  apt-get install libncurses5-dev)

 

 

我在編譯時間開啟了”prefix = $(HOME)”選項,因此我的vim被安裝在~/bin目錄。這時需要修改一下PATH變數,以使其找到我編輯好的vim。在~/.bashrc檔案中加入下面這兩句話:

PATH=$HOME/bin:$PATHexport 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內容如下,這是主程式,調用Function Compute某數的階乘並列印:

    /* ~/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/Makefilesample: sample.c factor/factor.cgcc -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 ~/tmpfile 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 addif ! 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()endifcall gdb("file " . g:vimgdb_debug_file)" easwy end 

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

" easwy addcall 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同屬一個項目。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.