Git でバグを bisect する
Mesa や Linux カーネルなどのプロジェクトで発生したバグを報告する際、 問題のあるコミットが何であるかを確認するために、最後に動作した既知のバージョン と問題のある新しいバージョンとの間でバイセクトを行うよう求められることがよくあ ります。Arch では、AUR の機能のおかげで、これは非常に簡単に行うことができます。
目次
古いリリースに戻す場合
問題を引き起こしているのが新しいパッケージのリリースであることを確認することは有用かもしれません。Arch での パッケージのダウングレード は、古いバージョンのパッケージがシステムにキャッシュとして保存されていれば、簡単に実行できます。
git からのパッケージの構築
bisect を行うには、git からパッケージのバージョンをビルドする必要があります。これは AUR から -git パッケージをビルドすることで実現できます。
bisect のセットアップ
パッケージのビルドが成功したら、src/
ディレクトリ内の git ルートディレクトリに移動する必要があります。git ルートディレクトリの名前は、多くの場合pkgname
と同じです。(または接尾辞 -git
を除いたもの)
$ cd src/git_root
そこから、bisecting するプロセスを開始できます:
$ git bisect start
次のコマンドは、bisecting する場所を指定するために使用できるすべてのタグを表示します:
$ git tag
前の例に続いて、バージョン oldver は機能したが、newver は機能しなかったと想定します。
$ git bisect good oldver $ git bisect bad newver
良いバージョンと悪いバージョンのタグが付けられたので、コミットのテストに進むことができます。
Bisecting
Change back into the directory with the PKGBUILD. If you are still in the directory mentioned in the previous section this can be accomplished like so:
$ cd ../..
You can now rebuild and install the specific revision of the package:
$ makepkg -efsi
Once the new package is installed you can test for your previously discovered error. Return to the directory you were in the previous section:
$ cd src/git_root
If you encountered your problem, tell that the revision was bad:
$ git bisect bad
If you did not encounter your problem, tell that the revision it was good:
$ git bisect good
Then do as described at the beginning of this section again and repeat until git bisect names the troublesome commit.
Speeding up builds
Building smaller kernel
You can shorten kernel build times by building only the modules required by the local system using modprobed-db, or by make localmodconfig
. Of course you can completely drop irrelevant drivers, for example sound drivers to debug a network problem.
Ccache
If you are bisecting a large project built using gcc
, it might be possible to reduce build times by enabling ccache. It may take several build iterations before you start to see benefits from the cache, however. The likelihood of cache hits generally increases as the distance between bisection points decreases.
Restoring package
Reverting to an original version of the package can be done by installing the package from repositories with pacman.