The Chromium Chronicle #13: การแก้ไขข้อบกพร่องเกี่ยวกับการเดินทางข้ามเวลาด้วย RR

ตอนที่ 13: โดย Christian Biesinger ในเมืองเมดิสัน รัฐวิสคอนซิน (มีนาคม 2020)
ตอนก่อนหน้า

คุณทำการทดสอบแบบเดียวกันซ้ำแล้วซ้ำอีกในโปรแกรมแก้ไขข้อบกพร่องไหม พยายามหาสาเหตุที่ทำให้โค้ดมีปัญหาใช่ไหม เรามีเครื่องมือให้คุณ ติดตั้งและตั้งค่าได้ง่าย โดยจะบันทึกการติดตามการดำเนินการ พลังเวทมนตร์ใหม่ๆ ให้กับ gdb ถอยหลัง วิ่งถอยหลัง ดูว่า ตัวแปรเปลี่ยนค่าหรือเวลาที่เรียกใช้ฟังก์ชันในออบเจ็กต์ครั้งล่าสุด (โดยใช้เบรกพอยท์แบบมีเงื่อนไข)

ใน Linux คุณสามารถใช้ RR ติดตั้งโดยใช้ sudo apt-get install rr หรือ จาก https://rr-project.org/

วิธีนี้ไม่ได้รับการสนับสนุนอย่างเป็นทางการ แต่เป็นประโยชน์มาก วิธีการทำงานของ rr คุณบันทึกการติดตามก่อน แล้วเล่นซ้ำ

rr record .../content_shell --no-sandbox  --disable-hang-monitor --single-process
# record the trace. --single-process is optional, see below. The other flags are required.
rr replay # This will replay the last trace
(gdb)       # rr uses GDB to let you replay traces

ซึ่งสะดวกสบาย ที่อยู่ของช่วงเวลาและตัวชี้จะยังคงเหมือนเดิมทุกครั้งที่เล่นซ้ำ การติดตามเดียวกัน ทำให้การติดตามเป็นแบบพกพาได้โดยใช้ rr pack เพื่อให้คุณ สามารถคัดลอกวิดีโอไปยังเครื่องอื่นแล้วเล่นซ้ำได้ในอุปกรณ์นั้น หรือเล่นซ้ำหลังจาก กำลังคอมไพล์ซ้ำ เรียกใช้โปรแกรมของคุณโดยใช้ continue คุณสามารถใช้ตัวเลือกการตั้งค่า คำสั่ง GDB -b, next, watch ฯลฯ แต่คุณก็สามารถใช้ ย้อนกลับ-ถัดไป (rn), ย้อนกลับ-ต่อ (rc), ย้อนกลับ (rs), ครีบกลับด้าน

ค่าเหล่านี้ยังคงเป็นไปตามเบรกพอยท์ที่คุณตั้งค่าไว้ เช่น

(gdb) c  # Execute to the end
(gdb) break blink::LayoutFlexibleBox::UpdateLayout
(gdb) rc # Run back to the last layout call
Thread 5 hit Breakpoint 1, blink::LayoutBlock::UpdateLayout (
    this=0x121672224010)
(gdb) # Inspect anything you want here. To find the previous Layout call on this object:
(gdb) cond 1 this == 0x121672224010
(gdb) rc
Thread 5 hit Breakpoint 1, blink::LayoutBlock::UpdateLayout (
    this=0x121672224010)
(gdb) watch -l style_.ptr_ # Or find the last time the style_ was changed
(gdb) rc
Thread 5 hit Hardware watchpoint 2: -location style_.ptr_

Old value = (const blink::ComputedStyle *) 0x1631ad3dbb0
New value = (const blink::ComputedStyle *) 0x0
0x00007f68cabcf78e in std::__Cr::swap<blink::ComputedStyle const*> (

ในตัวอย่างนี้ ฉันใช้ --single-process เพื่อให้เข้าใจง่าย แต่ ไม่จำเป็น RR ติดตามได้หลายกระบวนการ หลังจากบันทึก คุณจะ ดูรายการโดยใช้ rr ps และเลือก 1 รายการเพื่อเล่นซ้ำกับ rr replay -f PID

RR อาจมีประโยชน์ได้หลายวิธี มีคำสั่งอื่นๆ ที่ใช้ได้ เช่น เมื่อใดเพื่อดูว่าคุณอยู่ที่หมายเลขกิจกรรมใด หรือ rr replay -M เพื่อใส่คำอธิบายประกอบ stdout ด้วยรหัสกระบวนการและหมายเลขเหตุการณ์สำหรับแต่ละบรรทัด โปรดดู ดูรายละเอียดเพิ่มเติมได้ที่เว็บไซต์และเอกสารประกอบของ RR