ITSUKI.
技術705 文字2 分

Day 22|git bisect — 変化した地点を、半分ずつ絞る

#Codex#ソースコードリーディング#図解

この章しょうの答こたえ

同おなじ判定はんていで good と bad を区別くべつし、最初さいしょに変かわった commit を探さがす。

数百すうひゃくの commit を順番じゅんばんに試ためす代かわりに、良よかった地点ちてんと悪わるい地点ちてんの間かんを半分はんぶんずつ絞しぼります。ただし探索たんさくの信頼性しんらいせいは、「この commit は良よいか」を毎回まいかい同おなじ意味いみで判定はんていできるかにかかっています。

01|図でつかむ

図22|git bisect

判定はんていできない commit は skip。ビルドできないことと、調査中ちょうさちゅうのバグがあることを混同こんどうしない。

02|3つのポイントで理解する

1. まず両端で同じ症状を確認する

good と bad では、同おなじ再現手順さいげんてじゅんと期待値きたいちを使つかいます。テストが途中とちゅうの版はんで使つかえなくなる場合ばあいは、判定方法はんていほうほうの互換性ごかんせいも考かんがえる必要ひつようがあります。

2. 判定スクリプトの終了コードを決める

git bisect run では 0 が good、1〜127 のうち125以外いがいが bad、125 が skip です。ツール不足ふそくなどでテスト不能ふのうな状態じょうたいを、症状しょうじょうの再現さいげんとして bad にしないよう区別くべつします。

3. 候補を独立に確かめる

探索たんさく結果けっかが出でたら、候補こうほとその前まえの commit を同おなじ条件じょうけんで比較ひかくします。skip が多おおいと候補こうほを一ひとつに絞しぼれないこともあります。終おわったら git bisect reset で探索たんさく状態じょうたいを終了しゅうりょうします。

03|ソースで確かめる

以下いかは専用せんようの作業さぎょうコピーで使つかう手順てじゅんのひな型かたです。山やま括弧かっこの commit とスクリプトのパスは、確認済かくにんずみみの値あたいに置き換おきかえます。

git bisect start
# 確認済みの commit を指定する
git bisect bad <bad-commit>
git bisect good <good-commit>
git bisect run python3 /absolute/path/to/oracle.py
git bisect reset

小さく試す

専用せんようの作業さぎょうコピーで行おこなう前提ぜんていで、good・bad・判定はんてい不能ふのうの条件じょうけんを文章ぶんしょうにします。原稿げんこうの /tmp のスクリプトは付属ふぞくしていないため、自分じぶんの判定はんていを用意よういします。

04|30秒で復習

  • 両端りょうたんを同おなじ条件じょうけんで判定はんていする。
  • 0・bad・125 の意味いみを区別くべつする。
  • 結果けっかの commit と直前ちょくぜんの挙動きょどうを再確認さいかくにんする。

全ぜん30章しょうの目次もくじへ