これまでGitの内側の仕組みなどをチェックしてきて、最近ようやくソースコードをデバッグしてみても処理が追えそうというところまできたので記事にまとめておきます。ただ色々試しながらやった結果なので、もっとよいやり方はあるかもしれません。
emacsとgdbをインストール
今回OSはCentOSを使っていきます。
sudo yum install emacs sudo yum install gdb
gitのソースコードをクローンする
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
デバッガが起動しました。画面上側がコマンドラインで、下側がソースになっています。
# ステップ実行(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環境でもなんとかやっていけそうなので、このままコードリーディングを進めてみようと思います。