ตอนที่ 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