本说明旨在以Linux内核为例来演示自动git bisect 。 在随后的搜索中,正式版本正式发布,所有内容均已损坏,最后一个好的版本。

工具包说明
工具箱[^ 7]是一个简单的项目,用于组装内核和模块,其最小配置足以在qemu中运行,最小的busybox,配置文件和少量的脚本。
- gcc;)
- Binutils
- 使
- e木
- 期望(仅当您要在示例中运行二等分时)
内核以及initramsfs映像是使用qemu启动的:
$ qemu-system-x86_64 -cpu host \ -kernel build-linux/arch/x86/boot/bzImage \ -initrd initramfs.cpio.xz \ -nographic -append "nokaslr console=ttyS0 root=/dev/ram" \ -enable-kvm -serial mon:stdio
没有密码,它立即将我们扔进控制台。
通过该项目,可以执行简单的二等分[^ 1]。
注意! 如果您打算重复下面介绍的操作,或者将其用作项目的基础,请记住:
- 内核在很大程度上取决于gcc和binutils版本,某些内核
只能与特定版本的gcc在一起,可以与
小修改或抑制错误或根本不收集 - 新版本的binutils可能存在问题(从2.31版开始)
在v4.16-rc3之前的内核版本上加载模块
我可以使用gcc 7.3.0和binutils 2.30的版本进行构建和
运行内核版本v4.14到v5.3-rc2。
问题陈述
实际上,这里提出了一个附加问题,在主要问题的框架内解决了该问题,并决定作为示例的基础。
在某些时候, debugfs中的路径的值与v4.14版本中最初实现的值有所不同 :
# ls /sys/kernel/debug/ gpio-mockup-event # ls /sys/kernel/debug/gpio-mockup-event gpio-mockup-A
开启(在v5.3-rc2上可见 ):
# ls /sys/kernel/debug/ gpio-mockup # ls /sys/kernel/debug/gpio-mockup gpiochip1
我的程序无法通过测试,而任务是找到何时,何地和谁,包括确定内核的“好”和“坏”正式版本。
用git bisect运行的解决方案
如果您重复此实验,请不要忘记完成以下操作:
$ git submodule update --init
通过git bisect run来运行bisect.sh ,脚本本身非常简单,包括三个操作:
清除一切
收集一切
运行测试/ bisect.expect (预期脚本)
测试启动qemu,等待promt,加载gpio-mockup模块,并检查/ sys / debug / kernel中是否存在目录。
我们开始该过程(除了最后一步,它与手动二等分相同):
$ git -C linux bisect start $ git -C linux bisect good v4.14 # $ git -C linux bisect bad v5.3-rc2 # Bisecting: 73727 revisions left to test after this (roughly 16 steps) [798bba01b44b0ddf8cd6e542635b37cc9a9b739c] RDMA/core: Fail early if unsupported QP is provided
运行git bisect run :
$ time git -C linux bisect run ../bisect.sh #
我们正在等待...我们正在等待...我们正在等待...总的来说,尽管试图节省装配时间,但我还是有一个装配:
$ time ../bisec.sh real 2m1.695s user 11m7.409s sys 2m0.751s
根据初步估计, git bisect应该处理16个步骤。
最后,结果是:
d51ee07a8de7d6d3f7738a5e74861133fd2d46a0 is the first bad commit commit d51ee07a8de7d6d3f7738a5e74861133fd2d46a0 Author: Bartosz Golaszewski <bgolaszewski@baylibre.com> Date: Thu Jan 17 15:04:23 2019 +0100 gpio: mockup: don't create the debugfs link named after the label User-space tests no longer use it and we're breaking the interface anyway. Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com> :040000 040000 c1a1873f4cfcecace123b72fb036c3861151c9b9 61917a273f4f1f078639463a29acb8a103d50b41 M drivers bisect run success real 42m6.873s user 192m39.291s sys 33m55.932s
好吧,结果给了我们所有东西都消失了的提交次数:
d51ee07a8de7d6d3f7738a5e74861133fd2d46a0 。
现在,您可以查看git bisect完成的所有步骤的列表:
git bisect日志 $ git bisect log git bisect start # good: [bebc6082da0a9f5d47a1ea2edc099bf671058bd4] Linux 4.14 git bisect good bebc6082da0a9f5d47a1ea2edc099bf671058bd4 # bad: [609488bc979f99f805f34e9a32c1e3b71179d10b] Linux 5.3-rc2 git bisect bad 609488bc979f99f805f34e9a32c1e3b71179d10b # good: [798bba01b44b0ddf8cd6e542635b37cc9a9b739c] RDMA/core: Fail early if unsupported QP is provided git bisect good 798bba01b44b0ddf8cd6e542635b37cc9a9b739c # good: [e266ca36da7de45b64b05698e98e04b578a88888] Merge tag 'staging-5.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging git bisect good e266ca36da7de45b64b05698e98e04b578a88888 # bad: [318222a35bfb0ae9b5ff3e359a583463e6cfcd94] Merge branch 'akpm' (patches from Andrew) git bisect bad 318222a35bfb0ae9b5ff3e359a583463e6cfcd94 # bad: [962d5ecca101e65175a8cdb1b91da8e1b8434d96] Merge tag 'regmap-v5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap git bisect bad 962d5ecca101e65175a8cdb1b91da8e1b8434d96 # bad: [f47d633134f7033e3d0c667419d9f8afd69e308d] Merge tag 'tag-chrome-platform-for-v5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux git bisect bad f47d633134f7033e3d0c667419d9f8afd69e308d # good: [6c3f98faddc7f07981c5365ba2f45905ad75fcaa] Merge branch 'i2c/for-5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux git bisect good 6c3f98faddc7f07981c5365ba2f45905ad75fcaa # bad: [2901752c14b8e1b7dd898d2e5245c93e531aa624] Merge tag 'pci-v5.1-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci git bisect bad 2901752c14b8e1b7dd898d2e5245c93e531aa624 # bad: [1a29e857507046e413ca7a4a7c9cd32fed9ea255] Merge tag 'docs-5.1' of git://git.lwn.net/linux git bisect bad 1a29e857507046e413ca7a4a7c9cd32fed9ea255 # bad: [3601fe43e8164f67a8de3de8e988bfcb3a94af46] Merge tag 'gpio-v5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio git bisect bad 3601fe43e8164f67a8de3de8e988bfcb3a94af46 # good: [cf2e8c544cd3b33e9e403b7b72404c221bf888d1] Merge tag 'mfd-next-5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd git bisect good cf2e8c544cd3b33e9e403b7b72404c221bf888d1 # good: [8fab3d713ca36bf4ad4dadec0bf38f5e70b8999d] Merge tag 'gpio-v5.1-updates-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into devel git bisect good 8fab3d713ca36bf4ad4dadec0bf38f5e70b8999d # bad: [9aac1e336c3ab3824f646224f4b2309b63c51668] Documentation: gpio: legacy: Don't use POLLERR for poll(2) git bisect bad 9aac1e336c3ab3824f646224f4b2309b63c51668 # good: [0248baca03b8f188eccbb991bda2caec4c330975] Merge tag 'intel-gpio-v5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel into devel git bisect good 0248baca03b8f188eccbb991bda2caec4c330975 # bad: [e09313ce7ea1706d1642c7d5af103915e69fc6d0] gpio: mockup: change the signature of unlocked get/set helpers git bisect bad e09313ce7ea1706d1642c7d5af103915e69fc6d0 # good: [cbf1e092f2d86e6d7cdb7f9ff8a333f52c826232] gpio: mockup: implement get_multiple() git bisect good cbf1e092f2d86e6d7cdb7f9ff8a333f52c826232 # bad: [83336668b94eb44ecd78a0b7840e43f0859e05cb] gpio: mockup: change the type of 'offset' to unsigned int git bisect bad 83336668b94eb44ecd78a0b7840e43f0859e05cb # bad: [d51ee07a8de7d6d3f7738a5e74861133fd2d46a0] gpio: mockup: don't create the debugfs link named after the label git bisect bad d51ee07a8de7d6d3f7738a5e74861133fd2d46a0 # first bad commit: [d51ee07a8de7d6d3f7738a5e74861133fd2d46a0] gpio: mockup: don't create the debugfs link named after the label
实际上,这是第一个测试的失败(是的-测试中有两个):
send "ls /sys/kernel/debug/\r" expect { "gpio-mockup-event" {} timeout { puts "gpio-mockup-event not found"; exit 1 } }
另一个检查因提交2a9e27408e12de455b9fcf66b5d0166f2129579e而中断 (当然是将它们分开但很懒,所以我只看了提交<< next >>):
send "ls /sys/kernel/debug/gpio-mockup-event/\r" expect { "gpio-mockup-A" { puts "gpio-mockup-A found" } timeout { puts "gpio-mockup-A not found"; exit 1 } }
好吧,让我们找出d51ee07a8de7提交何时进入了Linus的主分支,并提供了它的正式内核版本[^ 6]。
让我们看看直到d51ee07a8de7的所有提交都仅过滤合并提交[^ 3](合并提交)并具有直接路径[^ 4](祖先链):
$ git log --pretty=oneline d51ee07a8de7d6d3f7738a5e74861133fd2d46a0..master --ancestry-path --merges
这使我们在d51ee07a8de7和master之间进行了所有合并提交。 让我们看一下列表的末尾(仅显示最后三个条目):
3601fe43e8164f67a8de3de8e988bfcb3a94af46 Merge tag 'gpio-v5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio 3dda927fdbaac926c50b550ccb51ed18c184468b Merge branch 'ib-qcom-ssbi' into devel 2f7db3c70fdfb22480a1b0aa734664fc256532f2 Merge tag 'gpio-v5.1-updates-for-linus-part-2' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into devel
正如我们看到的最后一次提交一样,这是git分支的接管://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux在git中://git.kernel.org/pub/scm/linux/kernel / git / linusw / linux-gpio devel,列表中的第一个是Linus Torvalds同志接管了master分支中的Linus Walleij同志(GPIO子系统的<< Chief >>)分支。
有一个非常好的脚本[^ 2],无需人工操作即可立即得到结果:
# 3601fe43e816 $ git-find-merge d51ee07a8de7d6d3f7738a5e74861133fd2d46a0 master
在提交3601fe43e816之后找到第一个版本:
$ git name-rev --name-only 3601fe43e816 tags/v5.1-rc1~102
这里的数字102是从3601fe43e816到v5.1-rc1的距离,让我们使用第一个父项[^ 5]选项进行检查:
$ git -P log --pretty --oneline --first-parent \ --graph 3601fe43e816..v5.1-rc1 | wc -l 102
一切似乎井井有条。 我可以说内核的第一个正式版本中所有内容都<< >> v5.1-rc1 ,而在v5.0版本中,一切都很好:
$ git describe 3601fe43e816 v5.0-8748-g3601fe43e816
结论
自动执行此类操作会变得更加有趣,这已不是秘密。 鉴于组装时间长,手动进行如此多的步骤非常困难,您完全可以忘记自己在做什么。
实际上,在制定需求时,您可以执行任何操作,制作一个特殊程序并将其添加到initramfs中 ,或者检查您自己的东西并将其二等分。
在满足git bisect运行要求的同时,测试可以采用任何方便的形式。 此外,借助应用程序(例如,期望值相同),您可以将板卡的固件限制为所需的架构,并直接对其进行检查。
[^ 1]: 克里斯蒂安·库德(Christian Couder)。 带有“ git bisect run”的完全二等分法 。
[^ 2]: rmandvikar。 Git挂钩系统(全局,本地挂钩),实用程序外壳脚本,HOME dir的配置 。
[^ 3]: Scott Chacon和Ben Straub。 Pro Git书 。
[^ 4]: void.pointer。 祖先路径如何与git log一起使用? 。
[^ 5]: Marc G Gauthier。 Git Log的–first-parent选项 。
[^ 6]: Guillaume Morin。 查找包含特定提交的合并提交 。
[^ 7]: Linux内核git bisect模板
标头中使用的原始图片: https : //xkcd.com/1597/ 。