Posted on

Gitのソースコードをデバッグする

これまでGitの内側の仕組みなどをチェックしてきて、最近ようやくソースコードをデバッグしてみても処理が追えそうというところまできたので記事にまとめておきます。ただ色々試しながらやった結果なので、もっとよいやり方はあるかもしれません。

emacsとgdbをインストール

今回OSはCentOSを使っていきます。

sudo yum install emacs
sudo yum install gdb

gitのソースコードをクローンする

今回はGitHubにあるソースコードを利用します。

git clone https://github.com/git/git.git
cd git
# バージョンを指定してチェックアウトしておきます。
git chekcout -b v2.6.0-rc1

ソースコードをコンパイルする

まず必要なライブラリをインストールしてからコンパイルします。

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
make

emacsを起動してデバッグをする

環境が整ったので、ここからgdbを起動しgitコマンドのデバッグをしていきます。gdbはそのまま起動しても使えますが、emacsからの方がデバッグしやすいのでemacsからgdbを起動します。

# emacsを起動する
emacs -nw
# gdbを起動する
M-x
gdb
gdb --annotate=3 git
# main関数で止まるようにブレークポイントを指定します
(gdb) b main
# 実行
(gdb) r

デバッガが起動しました。画面上側がコマンドラインで、下側がソースになっています。
20150915005627

# ステップ実行(next)
(gdb) n
# 変数の内容をチェック
(gdb) print argc
$1 = 1
# ステップイン(step)
(gdb) s
# 最後まで実行(continue)
(gdb) c

gitコマンドを実行した場合、676行目までいき usage と The most commonly used git commands が表示されて終了します。

    /* The user didn't specify a command; give them help */
    commit_pager_choice();
    printf("usage: %s\n\n", git_usage_string);
    list_common_cmds_help();
    printf("\n%s\n", _(git_more_info_string));
=>  exit(1);

まとめ

普段開発ではIntelliJを利用しているのでCLionでもできないかと色々試してみましたが、そもそもMacでコンパイルを通すこともできず断念しました。ただおかげでLinux環境でもなんとかやっていけそうなので、このままコードリーディングを進めてみようと思います。

参考