使用 Git 进行 Bisect 调试
通常,当报告在使用 Mesa 或 Linux 内核等项目时遇到的错误时,可能会要求用户在他们已知的最后一个工作版本和导致他们出现问题的新版本之间进行 bisect 调试,以找出有问题的提交。在 Arch 上,这可以借助 AUR 的功能轻松完成。
回退到旧版本
确认是新的软件包版本导致问题可能很有用。只要旧版本的软件包仍然作为缓存存储在您的系统上,或者您可以使用 Arch Linux 归档,就可以轻松完成 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
前缀完整非常重要,否则它将删除您所做的所有更改。安装新软件包后,您可以测试之前发现的错误。返回到上一节所在的目录
$ cd src/git_root
如果您遇到了问题,请告知该修订版本是坏的
$ git bisect bad
如果您没有遇到问题,请告知该修订版本是好的
$ git bisect good
然后再次执行本节开头描述的操作并重复,直到 git bisect 指出有问题的提交。
- 您可能需要在发出
git bisect
命令后运行make clean
。 - 它实际上会将步骤数一直倒数到零,因此在它真正指出第一个坏提交之前,请务必不要停止。
加速构建
Ccache
如果您正在 bisect 调试使用 gcc
构建的大型项目,则可以通过启用 ccache 来缩短构建时间。但是,可能需要多次构建迭代才能开始看到缓存的好处。缓存命中的可能性通常随着二分点之间距离的减小而增加。
make clean
,这意味着 ccache 完全是浪费。恢复软件包
要恢复到软件包的原始版本,可以通过使用 pacman 从仓库安装软件包来完成。