cscope

cscopeとは

cscopeとは、対話形式によるC言語プログラムを検査するツールです。

ソースコード全体から、関数や変数の定義場所を検索/移動(タグジャンプ)することや、関数の参照先一覧を表示することができます。

手作業でgrepコマンドを実行するよりも効率的に検索することが可能になります。


cscopeのシンボル系検索機能は以下のことが可能です。

  • シンボルの検索
    • 宣言/定義/参照が検索対象
  • 定義位置の検索
    • 定義が検索対象
  • 呼び出し先の検索
    • 指定関数から呼び出されている関数の一覧
  • 呼び出し元の検索
    • 指定関数を呼び出している関数の一覧
  • 文字列の検索
    • シンボル検索での検索対象に加えてコメント記述等を対象に検索
  • egrep での検索
    • 正規表現

cscopeの使い方(vi/vimエディターを利用)

1 ソースコードを静的解析する

cscopeでソースコードのインデックスデータベースを作成します。

対象ソースコード群のトップディレクトリに移動して、以下のコマンドを実行します。


$ cscope -Rb

実行完了すると「cscope.out」というファイルが作成されます。


$ ls -l cscope.out
-rw-r--r--  1 user  staff  13778759 12 13 00:21 cscope.out

2 エディターに関連付ける

vimエディターに、cscopeの解析データを関連付けます。

コマンドモードから「:cs add cscope.out」コマンドを実行します。


$ vim
:cs add cscope.out

3 cscopeを利用する

cscopeのコマンド形式は以下の通りです。

vimエディターのコマンドモードから実行します。


:cs [コマンド] [サブコマンド] [検索対象名] ...

リストアップしたファイルから、指定ファイルへ移動する場合には「q」キーを押して、リストの番号を入力します。

vimエディターのコマンドモードから「:cs」コマンドを実行すると、ヘルプが表示されます。


cscope commands:
add  : Add a new database             (Usage: add file|dir [pre-path] [flags])
find : Query for a pattern            (Usage: find c|d|e|f|g|i|s|t name)
       c: Find functions calling this function
       d: Find functions called by this function
       e: Find this egrep pattern
       f: Find this file
       g: Find this definition
       i: Find files #including this file
       s: Find this C symbol
       t: Find assignments to
help : Show this message              (Usage: help)
kill : Kill a connection              (Usage: kill #)
reset: Reinit all connections         (Usage: reset)
show : Show connections               (Usage: show)
Press ENTER or type command to continue

cscopeの使用頻度の高いコマンド

ファイルの検索

ファイルの検索を行う場合、以下のコマンドを実行します。


:cs f f [ファイル名]

実行例は以下の通りです。

リストアップしたファイルから、指定ファイルへ移動する場合には「q」キーを押して、リストの番号を入力します。


:cs f f sys
Cscope tag: sys
   #   line  filename / context / line
   1      1  lib/syscall/sp_access.c <<<unknown>>>
   2      1  lib/syscall/sp_brk.c <<<unknown>>>
Type number and <Enter> (empty cancels): 

関数/変数の検索

関数/変数といったシンボルの検索を行う場合、以下のコマンドを実行します。


:cs f s [ファイル名]

実行例は以下の通りです。


:cs f s is_exec
Cscope tag: is_exec
   #   line  filename / context / line
   1     14  lib/syscall/sp_access.c <<is_exec>>
             is_exec(char *filepath)
   2     35  lib/syscall/sp_access.c <<main>>
             rc = is_exec(argv[1]);
Type number and <Enter> (empty cancels): 

vimエディターに関連付ける

エディター設定ファイル「.vimrc」にcscopeデータベースを自動的に読み込む設定をします。

これにより、エディター起動毎に「:cs add」コマンドを実行する必要が無くなります。


$ vim .vimrc
"============================================================
"  cscope settings
"============================================================
if has("cscope")
    set csprg=/usr/bin/cscope
    set csto=0
    set cst 
    set nocsverb
    " 現在ディレクトリのデータベースを読み込む
    if filereadable("cscope.out")
        cs add cscope.out
    elseif $CSCOPE_DB != ""
        " cs add $CSCOPE_DB
    endif
    set csverb
endif

メモ

cscopeはそもそもC言語のソースコードで利用することを想定されてツールですが、C++やJavaのような言語でも十分に使用することができます。

cscopeでは関数や変数へのダイレクトなタグジャンプができません。ctagsコマンドと併用することで、タグジャンプを用いた効率的なソースコード開発が可能となります。


関連ページ