使用 Git 进行 Bisect 调试

出自 ArchWiki
(重定向自 Bisect

通常,当报告在使用 Mesa 或 Linux 内核等项目时遇到的错误时,可能会要求用户在他们已知的最后一个工作版本和导致他们出现问题的新版本之间进行 bisect 调试,以找出有问题的提交。在 Arch 上,这可以借助 AUR 的功能轻松完成。

回退到旧版本

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

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

从 git 构建软件包

为了进行 bisect 调试,我们将需要从 git 构建软件包版本。这可以通过从 AUR 构建 -git 软件包来完成。

设置 bisect

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

$ cd src/git_root

从那里您可以开始 bisect 调试过程

$ git bisect start

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

$ git tag

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

$ git bisect good oldver
$ git bisect bad newver

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

Bisect 调试

切换回包含 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

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

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

恢复软件包

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

参见