ksaitoの日記

日々試したことの覚え書き

globalはソースコードを読むためのツール

globalは、CやJavaソースコードを解析して定義や参照をエディタから、たどれるようにしてくれます。
類似のツールでetagsやctagsがありサポートしている言語や使い方が微妙に違います。

インストール

$ sudo aptitude install global
$

設定

タグ付け

対象となるソースコードをタグ付けします。
ソースが保存されているトップのディレクトリでgtagsコマンドを実行するだけで準備が整います。

$ ls
linux-source-2.6.31
$ gtags -v
[Sat Mar 06 03:25:55 JST 2010] Gtags started.
 Using default configuration.
...中略...
 [25025/25027] extracting tags of linux-source-2.6.31/fs/fat/dir.c
 [25026/25027] extracting tags of linux-source-2.6.31/fs/fat/namei_msdos.c
 [25027/25027] extracting tags of linux-source-2.6.31/fs/ioctl.c
[Sat Mar 06 03:27:27 JST 2010] Done.
$ ls
GPATH  GRTAGS  GSYMS  GTAGS  linux-source-2.6.31
$

Linux 2.6.31のソースコードには、25,027のソースファイルがあり約5分ほどでタグ付けが終了します。
Gで始まるファイルが4つで来ますが、いずれもBerkeley DBです。

bashからの使い方

bash用のrcファイルが/etc/globash.rcにあるので、これを読み込ませてbashを起動します。

$ bash --rcfile /etc/globash.rc 

GloBash --- Global facility for Bash

GloBash needs working directory.

Create '~/.globash'? ([y]/n) 

Created.

Welcome to Globash! When you need help, please type 'ghelp'.

[~/work/linux] 

x 定義名で定義されている場所が分かります。
mallocの定義されているのは、8箇所あります。

[~/work/linux] x malloc
>    1	malloc           2060 linux-source-2.6.31/arch/frv/kernel/gdb-stub.c static void *malloc(size_t size) __maybe_unused;
     2	malloc            217 linux-source-2.6.31/arch/powerpc/boot/ops.h static inline void *malloc(unsigned long size)
     3	malloc            370 linux-source-2.6.31/drivers/scsi/aic7xxx/aic79xx_osm.h #define malloc(size, type, flags) kmalloc(size, flags)
     4	malloc            375 linux-source-2.6.31/drivers/scsi/aic7xxx/aic7xxx_osm.h #define malloc(size, type, flags) kmalloc(size, flags)
     5	malloc             23 linux-source-2.6.31/include/linux/decompress/mm.h static void *malloc(int size)
     6	malloc             71 linux-source-2.6.31/include/linux/decompress/mm.h #define malloc(a) kmalloc(a, GFP_KERNEL)
     7	malloc            241 linux-source-2.6.31/lib/inflate.c static void *malloc(int size)
     8	malloc            269 linux-source-2.6.31/lib/inflate.c #define malloc(a) kmalloc(a, GFP_KERNEL)
[~/work/linux] 

The Linux KernelLinuxカーネルについての詳しい解説があります。