git bisect كمثال على Linux kernel

تهدف هذه الملاحظة إلى إثبات بوابة git bisect التلقائية باستخدام kernel Linux كمثال. مع البحث اللاحق للنسخة الرسمية التي تبدأ بها كل شيء وكسر آخر نسخة جيدة.


بوابة


وصف مجموعة الأدوات


مجموعة الأدوات [^ 7] عبارة عن مشروع بسيط لتجميع النواة والوحدات النمطية مع الحد الأدنى من التكوين الكافي للتشغيل في qemu ، والحد الأدنى من صندوق البريد ، وملفات التكوين وعدد صغير من البرامج النصية.


  • دول مجلس التعاون الخليجي.)
  • بينوتيلس
  • جعل
  • كيمو
  • نتوقع (فقط إذا كنت تنوي تشغيل مقطع من المثال)

يتم تشغيل kernel مع صورة 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].


تحذير! إذا كنت تخطط لتكرار المعالجات الواردة أدناه ، أو سيتم استخدامها كأساس لمشروعك ، ضع في اعتبارك:
  1. النواة تعتمد بشكل كبير على إصدارات gcc و binutils ، بعض النواة
    يمكن أن يجتمع فقط مع إصدار معين من gcc ، يمكن أن يجتمع مع
    تعديلات صغيرة أو قمع الأخطاء أو عدم جمعها على الإطلاق
  2. قد تكون هناك مشاكل في الإصدار الجديد من binutils (بدءًا من الإصدار 2.31)
    تحميل الوحدات النمطية على إصدارات kernel قبل الإصدار v4.16-rc3


إصدارات gcc 7.3.0 و binutils 2.30 اسمحوا لي أن بناء و
تشغيل إصدارات kernel 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 

ما كسر اختباراتي لبرنامجي ، والمهمة هي معرفة متى وأين ومن ، بما في ذلك تحديد الإصدارات الرسمية "الجيدة" و "السيئة" من النواة.


الحل مع تشغيل بوابة bitect


إذا كررت هذه التجربة ، فلا تنسَ إكمالها:


 $ git submodule update --init 

تشغيل bisect.sh خلال git bisect run ، البرنامج النصي نفسه بسيط للغاية ويتألف من ثلاثة إجراءات:


  1. مسح كل شيء


  2. اجمع كل شيء


  3. تشغيل الاختبارات / bisect.expect (سيناريو متوقع)



يبدأ الاختبار qemu وينتظر promt ويقوم بتحميل وحدة gpio-mockup ويتحقق من وجود أدلة في / sys / debug / kernel .
نبدأ العملية (هي نفسها بالنسبة إلى bisect اليدوي باستثناء الخطوة الأخيرة):


  $ 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 

وفقا للتقديرات الأولية ، ينبغي أن بوابة جيت التعامل مع 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 .


يمكنك الآن الاطلاع على قائمة بجميع الخطوات التي تم تنفيذها بواسطة bitect git :


بوابة سجل bitect
  $ 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 (بالطبع سيكون الفصل بينهما ولكن كسول ، لذلك أنا فقط نظرت في الإلتزامات << التالي >>):


  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 ومع إصدار kernel الرسمي الموجود [^ 6].


دعونا نرى جميع الإلتزامات حتى d51ee07a8de7 تصفية فقط إلتزامات الدمج [^ 3] (عمليات الدمج) وامتلاك مسار مباشر [^ 4] (سلسلة النسب):


  $ git log --pretty=oneline d51ee07a8de7d6d3f7738a5e74861133fd2d46a0..master --ancestry-path --merges 

هذا يعطينا كل عمليات الدمج بين d51ee07a8de7 والسيد. دعونا نلقي نظرة على نهاية القائمة (يتم عرض الإدخالات الثلاثة الأخيرة فقط):


  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 in git: //git.kernel.org/pub/scm/linux/kernel / git / linusw / linux-gpio devel ، والأول في القائمة هو الاستيلاء على فرع الرفيق Linus Walleij (<< رئيس >> النظام الفرعي GPIO) بواسطة الرفيق Linus Torvalds في فرع الماجستير.


هناك نص جيد جدًا [^ 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 run . علاوة على ذلك ، بمساعدة برامج التطبيق (على سبيل المثال ، يتوقع الشخص نفسه) ، يمكنك تقييد البرامج الثابتة للوحة بالبنية التي تحتاجها وإجراء اختبارات عليها مباشرةً.


[^ 1]: كريستيان كودير. bisecting مؤتمتة بالكامل مع "git bisect run" .


[^ 2]: rmandvikar. نظام السنانير Git (السنانير العالمية والمحلية) ونصوص شل الأدوات المساعدة والتهيئة لـ HOME dir .


[^ 3]: Scott Chacon و Ben Straub. كتاب جيت برو .


[^ 4]: void.pointer. كيف يعمل مسار الأجداد مع بوابة التسجيل؟ .


[^ 5]: Marc G Gauthier. Git Log's - الوالد الأول الخيار .


[^ 6]: غيوم مورين. العثور على التزام دمج يتضمن التزام محدد .


[^ 7]: Linux kernel git bisect template


الصورة الأصلية المستخدمة في الرأس: https://xkcd.com/1597/ .

Source: https://habr.com/ru/post/ar462245/


All Articles