これまでGitの内側の仕組みなどをチェックしてきて、最近ようやくソースコードをデバッグしてみても処理が追えそうというところまできたので記事にまとめておきます。ただ色々試しながらやった結果なので、もっとよいやり方はあるかもしれません。
emacsとgdbをインストール
今回OSはCentOSを使っていきます。
sudoyum installemacs
sudoyum installgdb
gitのソースコードをクローンする
今回はGitHubにあるソースコードを利用します。
git clonehttps://github.com/git/git.git
cd git
# バージョンを指定してチェックアウトしておきます。
git chekcout -b v2.6.0-rc1
ソースコードをコンパイルする
まず必要なライブラリをインストールしてからコンパイルします。
yum installcurl-devel expat-devel gettext-devel openssl-devel zlib-develperl-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環境でもなんとかやっていけそうなので、このままコードリーディングを進めてみようと思います。