1 คะแนน โดย GN⁺ 2024-07-22 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แนะนำ rr

    • rr เป็นเครื่องมือดีบักสำหรับ C/C++ บน Linux ที่ออกแบบมาเพื่อเสริม gdb
    • สามารถบันทึกความล้มเหลวเพียงครั้งเดียว แล้วนำบันทึกนั้นมาดีบักซ้ำได้หลายครั้ง
    • ดีบักได้โดยทำให้การรันเดิมเกิดซ้ำแบบเดียวกันทุกครั้ง
    • มอบความสามารถในการรันย้อนกลับอย่างมีประสิทธิภาพผ่าน gdb
  • ความสามารถของ rr

    • โอเวอร์เฮดต่ำ
    • รองรับการบันทึกและเล่นซ้ำแอปพลิเคชันหลากหลายประเภท (Firefox, Chrome, QEMU, LibreOffice เป็นต้น)
    • สามารถบันทึก เล่นซ้ำ และดีบักเวิร์กโหลดแบบหลายโปรเซสได้
    • รองรับการทำสคริปต์ gdb และการผสานรวมกับ IDE
    • ไฟล์ trace ที่ทนทานและบีบอัดแล้ว สามารถย้ายข้ามเครื่องได้
    • มีโหมด chaos สำหรับจำลองบั๊กที่เกิดเป็นครั้งคราวให้เกิดซ้ำได้
  • ประสบการณ์การดีบักด้วย rr

    • บันทึกแอปพลิเคชัน: rr record /your/application --args...
    • ดีบักการรันที่บันทึกไว้: rr replay
    • ดีบัก trace ที่บันทึกไว้แบบกำหนดผลลัพธ์ได้แน่นอน
    • ใช้คำสั่ง gdb ทั่วไปได้
    • สามารถย้อนกลับการรันเพื่อไปยังจุดที่มีปัญหาได้อย่างรวดเร็ว
  • วิดีโอ

    • วิดีโอเดโมการบันทึกและเล่นซ้ำ Firefox
    • วิดีโอที่อธิบายความสามารถพื้นฐานของ rr อย่างละเอียด
    • วิดีโอการบรรยายเชิงเทคนิคขั้นสูงโดย Robert O'Callahan
  • เริ่มต้นใช้งาน

    • แนะนำให้ build จากซอร์ส หากแพ็กเกจใช้งานไม่ได้
    • มีวิธีติดตั้งสำหรับ Fedora และ Ubuntu
  • เบื้องหลังและแรงจูงใจ

    • พัฒนาขึ้นเพื่อให้การดีบักความล้มเหลวที่เกิดเป็นครั้งคราวทำได้ง่ายขึ้น
    • การเล่นซ้ำแบบกำหนดผลลัพธ์ได้แน่นอนช่วยให้ข้อมูลที่ได้ระหว่างการดีบักยังคงใช้ได้
    • การรันย้อนกลับช่วยให้กระบวนการดีบักง่ายขึ้น
    • rr ถูกใช้งานเป็นประจำในหลายโครงการทั้งขนาดใหญ่และเล็ก
  • rr ทำงานอย่างไร

    • บันทึกโปรเซสใน user space บน Linux และจับทุกอินพุตที่มาจากเคอร์เนล
    • ระหว่างการเล่นซ้ำ จะรับประกัน control flow ระดับคำสั่ง รวมถึงเนื้อหาของหน่วยความจำและรีจิสเตอร์
    • layout ของหน่วยความจำ, address ของอ็อบเจ็กต์, ค่ารีจิสเตอร์ ฯลฯ จะคงเดิมเหมือนเดิม
    • มีพลังมากยิ่งขึ้นเมื่อใช้ร่วมกับ fuzzer และตัวฉีดความผิดพลาดแบบสุ่ม
  • บริบทของ rr

    • การดีบักแบบบันทึกและเล่นซ้ำเป็นแนวคิดที่มีมานานแล้ว
    • เป้าหมายการออกแบบมุ่งเน้นไปที่ Firefox
    • ความสามารถในการนำไปใช้งานจริง: รันได้บนเคอร์เนล Linux ทั่วไป โดยไม่ต้องเปลี่ยนการตั้งค่าระบบ
    • โอเวอร์เฮดขณะรันต่ำ
    • การออกแบบเรียบง่าย: หลีกเลี่ยงเทคนิคที่ซับซ้อน
  • ข้อจำกัด

    • จำลองเครื่องแบบ single-core
    • ไม่สามารถบันทึกโปรเซสที่แชร์หน่วยความจำกับภายนอก tree ของการบันทึกได้
    • ต้องใช้ CPU x86 สมัยใหม่ หรือ CPU ARM บางรุ่น
    • จำเป็นต้องรู้จักทุก system call ที่โปรเซสซึ่งถูกบันทึกใช้งาน
    • ต้องรองรับการเปลี่ยนแปลงของเคอร์เนล การอัปเดต system library และตระกูล CPU ใหม่
  • แหล่งอ้างอิงเพิ่มเติม

    • รายงานทางเทคนิคฉบับขยาย
    • วิกิของ rr
    • สามารถถามคำถามได้ผ่าน mailing list หรือใน #rr บน chat.mozilla.org

สรุปโดย GN⁺

  • rr เป็นเครื่องมือทรงพลังสำหรับการดีบัก C/C++ บน Linux ที่ช่วยเพิ่มประสิทธิภาพการดีบักอย่างมากด้วยการเล่นซ้ำแบบกำหนดผลลัพธ์ได้แน่นอน
  • รองรับทั้งแอปพลิเคชันหลากหลายประเภทและเวิร์กโหลดหลายโปรเซส พร้อมโอเวอร์เฮดต่ำ ทำให้ใช้งานได้จริง
  • ความสามารถในการรันย้อนกลับช่วยให้กระบวนการดีบักง่ายขึ้นมาก
  • สามารถใช้ดีบักแอปพลิเคชันซับซ้อนอย่าง Firefox ได้ จึงมีประโยชน์ในภาพรวม
  • เครื่องมือที่มีความสามารถใกล้เคียงกันได้แก่ gdb และ Valgrind

1 ความคิดเห็น

 
GN⁺ 2024-07-22
ความคิดเห็นบน Hacker News
  • GDB มีฟีเจอร์ reverse debugging อยู่แล้ว
  • rr มีความสามารถและความยืดหยุ่นมากกว่า
  • เคยใช้ rr ย้อนรอยโค้ดเบสขนาดใหญ่ได้สำเร็จ
  • ดีบักเกอร์จำเป็นต้องเข้าใจรายการสัญลักษณ์และ system call
  • สงสัยว่า rr ใช้งานได้กับภาษาอย่าง Rust, Zig, Odin และ Nim ด้วยหรือไม่
  • น่าจะใช้ไม่ได้กับภาษาที่ใช้ managed memory เช่น Python, JS และ C#
  • เคยมีโปรเจ็กต์ที่พยายามพอร์ตไปเป็น Rust แต่ถูกยุติไปแล้ว
  • น่าจะน่าสนใจหากมีการศึกษาเปรียบเทียบผลกระทบและข้อดีของการเขียน C++ ใหม่เป็น Rust
  • rr มีประโยชน์มาก แต่บ่อยครั้งไม่สามารถทำซ้ำบั๊กด้าน concurrency ได้
  • ถ้าบางภาษาฝัง rr เข้ากับเครื่องมือของตัวเองโดยตรงได้ก็น่าจะมีประโยชน์มาก
  • การดีบัก C/C++ ด้วย rr ทรงพลังมาก และช่วยปรับปรุงกระบวนการดีบักได้อย่างมาก
  • Pernosco สร้างบน rr และเพิ่มฐานข้อมูลที่สามารถ query ได้ของการรันโปรแกรมทั้งหมด
    • ถ้าคลิกค่าที่ผิด มันจะอธิบายได้ทันทีว่าค่านั้นมาจากไหน
    • คุณสามารถถามดีบักเกอร์ได้จริง ๆ ว่าเกิดอะไรขึ้น โดยไม่ต้องเข้าใจโค้ด
  • สงสัยว่าสามารถใช้ได้แม้ในกรณีที่คอมไพล์โค้ด C/C++ เป็น dll/so ที่ถูกเรียกจาก Python หรือไม่
  • สงสัยว่าปัญหาที่ rr มีกับ CPU Ryzen ได้รับการแก้ไขแล้วหรือยัง