Q068891のメモ帳

気が向いたときにLinuxだったり、プログラムだったり、適当なメモをざっくばらんに書いてます。

GNU GLOBALをCentOS6にインストール&簡単な使い方メモ

GNU GLOBALについて

単純なvimとかでプログラムのソースを見ている場合、コード量が膨大だとコードが読み難いです。

なんか良いの無いかなと探してみたところ、GNU GLOBALのプラグインvimに導入すれば、指定した関数の記述箇所に飛んだりできるそうです。便利そうなのでインストールしてとりあえず使ってみました。

https://www.gnu.org/software/global/

GNU GLOBALインストール(CentOS6.5で実施)

下記の通り実施インストールしていきます。

# wget http://tamacom.com/global/global-6.5.4.tar.gz
# tar xzf global-6.5.4.tar.gz
# cd global-6.5.4 ;pwd
# ./configure
# make
# make install

無事インストールできていればgtagコマンドが使用できる用になっているはずです。

次に、vimプラグインをコピーし、vimGNU GLOBALを使用できるようにすれば設定完了です。

# mkdir -p ~/.vim/plugin
# cp -ip /usr/local/share/gtags/gtags.vim ~/.vim/plugin

以上でインストール完了です。

GNU GLOBAL使い方

今回は例としてLinuxカーネルソースを見ていきます。 適当なkernelソースをダウンロード&展開していきます。

# wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.gz
# tar xfz linux-2.6.39.tar.gz

GNU GLOBALを使うには、まず見たいコードの解析をしてタグをつける必要があります。

タグをつけるにはgtagsコマンドを実行してタグ付けをします。gtagsコマンドを実行するとGPATH、GTAGS、GRTAGS、GSYMS ファイルが作成されます。

# cd linux-2.6.39;pwd
# gtags

タグをつけたら、適当に見たいソースをvimで開いてみます。

今回はsignal.cを開いてみます。

# vim kernel/signal.c

例としてsignal.cの中に記述されている下記do_tkill関数を見てみます。

▼signal.cのdo_tkill関数
 static int do_tkill(pid_t tgid, pid_t pid, int sig)
 {
         struct siginfo info;
 
         info.si_signo = sig;
         info.si_errno = 0;
         info.si_code = SI_TKILL;
         info.si_pid = task_tgid_vnr(current);
         info.si_uid = current_uid();
 
         return do_send_specific(tgid, pid, sig, &info);
 }

この中で実行しているtask_tgid_vnr関数の定義元を見たい場合は、vim上で下記コマンドを実行すると関数が記述してある箇所に飛ぶことができます。ファイルを跨いでの移動も可能です。

 :Gtags task_tgid_vnr

f:id:Q068891:20161017064250p:plain

また、下記Gtagsの-rオプションをvimで実行することで、do_tkillを呼び出している関数一覧がQuickFixListに表示できます。

:Gtags -r do_tkill

f:id:Q068891:20161017064420p:plain QuickFixListのウィンドウに移動したいときは下記方法で次のウィンドウへ移動するか、:qで一旦ファイル編集を抜ければファイル編集が終了し、QuickFixListのみが残りカーソル移動できます。

CTRL-W w ([Ctrl]押しながら[w]を押した後、もう1回[w]を押す)

QuickFixListウィンドウに移動後、QuickFixListの関数一覧から、見たい関数にカーソルを合わせてEnterを押すと、その関数が記述されている場所に移動することができます。

QuickFixListを閉じたいときは:ccl or :ccloseです。

※QuickFixについての詳しい操作方法は下記URLを参照して下さい。

http://vim-jp.org/vimdoc-ja/quickfix.html

ソースコード全体を検索して一覧を出したいときには下記を実行するとできます。

 :Gtags -g 検索したい文字列

指定したファイルの関数一覧を表示したい場合は下記を実行します。

 :Gtags -f kernel/signal.c

また、GNU GLOBALをインストールすると、globalコマンドが使用できるようになります。

globalコマンドの使い方

globalコマンドも事前にgtagsコマンドでソースを解析して、タグ付けをしておく必要があります。

指定したソースファイル(signal.c)の関数一覧を表示。

 # global -f kernel/signal.c 

指定した関数がどのファイルで定義されているかの一覧を表示。

 # global do_tkill
 kernel/signal.c
 #

指定した関数を呼び出している一覧を表示。

 # global -rx do_tkill

ソース全体を検索。

 # global -gx 検索したい文字列

終わりに

今回GNU GLOBALをvimに導入し、Linuxカーネルのソースを少しのぞいてみました。

指定した関数に飛ぶ機能(ファイル間を跨いでも可能)や、関数を呼び出している一覧を表示することができるなど、ぱっと見た感じコードを見るときに必要な機能は揃っていると感じました。よさそうなのでしばらく使ってみたいと思います。