使用 Git 进行错误二分查找

出自 ArchWiki

通常在报告 Mesa 或 Linux 内核等项目遇到的错误时,可能会要求用户在他们已知的最后一个工作版本和导致问题的较新版本之间进行二分查找,以找出有问题的提交。在 Arch 上,由于 AUR 的功能,这可以非常容易地完成。

恢复到旧版本

确认是新的软件包版本导致问题可能很有用。软件包降级在 Arch 上可以轻松完成,只要旧版本的软件包仍然作为缓存存储在您的系统中,或者您可以使用 Arch Linux Archive

注意: 即使旧版本修复了问题,仍然可能不是程序本身存在错误,而是 Arch 提供的软件包存在问题。

从 git 构建软件包

为了进行二分查找,我们需要从 git 构建软件包的版本。这可以通过从 AUR 构建 -git 软件包来完成。

设置二分查找

一旦软件包成功构建,您需要更改到 src/ 目录中的 git 根目录。git 根目录的名称通常与 pkgname 相同(或不带 -git 后缀)

$ cd src/git_root

从那里您可以开始二分查找的过程

$ git bisect start

以下命令将显示您可以用来指定二分查找位置的所有标签

$ git tag

继续之前的示例,我们将假设版本 oldver 对我们有效,而 newver 无效

$ git bisect good oldver
$ git bisect bad newver

现在我们已经标记了好的和坏的版本,我们可以继续测试提交。

二分查找

更改回包含 PKGBUILD 的目录。如果您仍在上一节中提到的目录中,可以这样做

$ cd ../..

现在您可以重建并安装软件包的特定版本

$ makepkg -efsi
注意: 保持 -e 前缀完整非常重要,否则它将删除您所做的所有更改。
提示: 或者,要在干净的 chroot 中构建软件包,请运行 extra-x86_64-build(由 devtools 提供),然后使用 pacman -U 安装它。

一旦新软件包安装完成,您可以测试您之前发现的错误。返回到您在上一节中所在的目录

$ cd src/git_root

如果您遇到问题,请告知该版本是坏的

$ git bisect bad

如果您没有遇到问题,请告知该版本是好的

$ git bisect good

然后再次按照本节开头所述进行操作并重复,直到 git bisect 找出有问题的提交。

注意
  • 在发出 git bisect 命令后,您可能需要运行 make clean
  • 它实际上会将步骤数一直倒数到零,因此重要的是不要停止,直到它实际指出第一个坏的提交。

加速构建

Ccache

如果您正在二分查找使用 gcc 构建的大型项目,则可以通过启用 ccache 来缩短构建时间。但是,可能需要多次构建迭代后才能开始看到缓存的好处。缓存命中的可能性通常随着二分查找点之间距离的减小而增加。

注意: Ccache 仅在编译完全相同的源代码时有效。而要二分查找内核,则不必执行 make clean,这意味着 ccache 完全是浪费。

恢复软件包

可以通过使用 pacman 从仓库安装软件包来恢复到软件包的原始版本。

参见