เหตุใดการดีบักแบบย้อนกลับจึงไม่ค่อยได้ใช้ [ปิด]


56

gdb นำการสนับสนุนสำหรับการดีบักแบบย้อนกลับในปี 2009 (ด้วย gdb 7.0) ฉันไม่เคยได้ยินมาก่อนจนกระทั่งปี 2012 ตอนนี้ฉันพบว่ามีประโยชน์อย่างมากสำหรับปัญหาการดีบักบางประเภท ฉันหวังว่าฉันเคยได้ยินมาก่อน

แก้ไขให้ถูกต้องหากฉันผิด แต่ความประทับใจของฉันคือเทคนิคยังไม่ค่อยมีใครใช้และคนส่วนใหญ่ไม่รู้ว่ามีอยู่จริง ทำไม?

คุณรู้จักชุมชนการเขียนโปรแกรมใด ๆ ที่มีการใช้การดีบักแบบย้อนกลับหรือไม่?

ข้อมูลพื้นฐาน:


47
เพื่อประโยชน์ของผู้ที่ไม่ทราบว่ามีอยู่อะไรการดีบักแบบย้อนกลับคืออะไร
Mason Wheeler

5
MS เรียกว่าระบบ Intellitrace ของพวกเขาซึ่งดูเหมือนจะคล้ายกับสิ่งที่คุณเรียกว่า debese debugging มันอาจเป็นชื่อของหลาย ๆ ชื่อขึ้นอยู่กับสภาพแวดล้อมทำให้ดูเหมือนว่าจะไม่ค่อยมีคนใช้
Ryathal

1
เพียงเพื่อสิ่งที่คุ้มค่า: ก็จริงๆมากที่มีอายุมากกว่าที่คุณรู้ - ไมโครซอฟท์ได้รับการสนับสนุนใน QuickC (ประมาณ 1989 หรือ '90 หากหน่วยความจำให้บริการ)
Jerry Coffin

41
@MasonWheeler อย่างชัดเจนย้อนกลับการแก้ไขจุดบกพร่องคือการกระทำของการเพิ่มข้อบกพร่องในรหัส ฉันไม่เห็นด้วยกับหลักฐานของ OP ว่านี่เป็นการปฏิบัติที่ผิดปกติ
Ben Lee

3
@BenLee เราเรียกว่าการเริ่มต้นใหม่
OldFart

คำตอบ:


26

สำหรับการทำงานในโหมดดีบักที่มีการบันทึกนั้นมีราคาแพงมากเมื่อเทียบกับโหมด debug ปกติ มันยังใช้หน่วยความจำมากขึ้น

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

โปรดทราบว่านี่เป็นเวลาหลายปีแล้วและทำงานร่วมกับการเปลี่ยนรหัสร้อน


1
คำตอบที่ดีมาก ฉันสามารถยืนยันได้ว่าการบันทึกมีราคาแพง คุณต้องเปิดใช้งานก่อนที่คุณจะเข้าสู่ส่วนสำคัญของแอปพลิเคชันของคุณซึ่งไม่สำคัญเลย ฉันยังยอมรับด้วยว่า "การเลื่อนไปที่เฟรม" มักจะดีพอ มันใช้งานไม่ได้กับลูปหรืออัลกอริทึมแบบเรียกซ้ำ
Philipp Claßen

2
จนกระทั่งถึง rr ( rr-project.org ) ความเร็วขณะบันทึกการประมวลผลโดยใช้ rr นั้นแทบจะช้ากว่า จากนั้นคุณสามารถเล่นซ้ำขั้นตอนย้อนหลังตั้งตัวเฝ้าดูใน IDE ที่คุณชื่นชอบ ( github.com/mozilla/rr/wiki/Using-rr-in-an-IDE ) ที่คุณชื่นชอบ... วิธีที่คุณแก้จุดบกพร่องรหัสของคุณจะไม่เป็น เหมือนกัน.
jyavenard

11

ดังกล่าวแล้วประสิทธิภาพเป็นกุญแจสำคัญเช่นกับการดีบักแบบย้อนกลับได้ของ gdb การทำงานบางอย่างเช่น gzip เห็นการชะลอตัวของ 50,000 เท่าเมื่อเทียบกับการทำงานแบบดั้งเดิม อย่างไรก็ตามมีตัวเลือกเชิงพาณิชย์: ฉันทำงานกับ Undo undo.ioและผลิตภัณฑ์ UndoDB ของเราทำเหมือนกัน แต่มีการชะลอตัวน้อยกว่า 2x มีตัวแก้จุดบกพร่องเชิงพาณิชย์อื่น ๆ


1
น่าสนใจฉันจะลองดู ในหลายบทความมีการระบุว่าเป็นฟรีสำหรับการใช้งานที่ไม่ใช่เชิงพาณิชย์ แต่ฉันไม่พบข้อมูลยืนยันว่าในหน้าแรกของคุณ มันยังคงเป็นจริงหรือไม่? ขอขอบคุณที่เปิดเผยความร่วมมือของคุณ
Philipp Claßen

2
UndoDB รุ่นเริ่มต้นและรุ่นมืออาชีพราคาเท่าใด ฉันไม่เห็นพวกเขาในหน้ารุ่น UndoDB
tcrosley

3
พวกคุณเปรียบเทียบกับ Mozilla rrอย่างไร?
Ciro Santilli 新疆改造中心法轮功六四事件

10

สำหรับภาพรวมของตัวเลือกเทคโนโลยีและผลิตภัณฑ์ให้ดูชุดของโพสต์บล็อกที่ฉันเขียนเกี่ยวกับปีที่แล้ว (และติดตามตั้งแต่):

ความรู้สึกของฉันที่ว่าทำไมมันถึงได้มีการใช้เพียงเล็กน้อยก็คือมันต้องการฮาร์ดแวร์พิเศษหรือใช้ดีบักเกอร์พิเศษหรือตั้งค่าระบบของคุณให้ถูกต้อง คนส่วนใหญ่ไม่ได้ลงทุนเวลาเพื่อรับคุณค่าสูงสุดจากเครื่องมือแก้ไขข้อบกพร่องของพวกเขาโชคไม่ดี

และความจริงที่ว่า "ค่าเริ่มต้นราคาถูก" ของ gdb นั้นเกือบจะช้าอย่างผิดปกติและมีปัญหาด้านเสถียรภาพเล็กน้อยสำหรับทุกสิ่ง แต่เป็นระบบเป้าหมายที่พบบ่อยที่สุด


4

จากประสบการณ์ของฉันในฐานะวิศวกรฝ่ายขายสำหรับดีบัก TotalView ผู้คนรู้ว่ามันมีอยู่ แต่พวกเขาไม่คิดว่ามันจะทำงานได้โดยไม่คำนึงถึงการชะลอตัว (ยอมรับหรือไม่)

มหาวิทยาลัยเคมบริดจ์เมื่อเร็ว ๆ นี้ได้สำรวจสิทธิ"ล้มเหลวที่จะนำมาใช้ย้อนกลับแก้จุดบกพร่องค่าใช้จ่ายในเศรษฐกิจโลก $ 41 พันล้านปี"

และกลับมาที่ GDB ฉันได้ยินมาบ่อยครั้งมากว่าการชะลอตัวทำให้แอพพลิเคชั่น "ชีวิตจริง" ใช้งานไม่ได้

ฉันชอบที่จะได้รับการตอบกลับจากผู้คนจำนวนมากโดยใช้การดีบักแบบย้อนกลับในแอปพลิเคชันอื่น ๆ ที่ไม่ใช่ "Hello world!"


4
ฉันคิดว่ามันจะเป็นการดีกว่าที่จะเชื่อมโยงการศึกษานี้มากกว่าสแปม 'เลิกทำซอฟต์แวร์' ที่แกล้งทำเป็นเกี่ยวกับการศึกษา
Bulwersator

1
ที่งานเก่าของฉันฉันทำงานในการสร้างดีบักเกอร์แบบย้อนกลับ ( ghs.com/products/timemachine.html ) เราใช้ตัวดีบักเกอร์อย่างหนักและฉันบอกได้เลยว่ามันเหลือเชื่อมาก แน่นอนว่ามันยอดเยี่ยมมากในสภาพการแข่งขันที่มีขนดกจริงๆ แต่มันก็เป็นมากกว่านั้น เมื่อย้อนกลับการดีบั๊กอยู่ตลอดเวลาความคิดของคุณเกี่ยวกับการแก้ไขข้อบกพร่องจะเปลี่ยนแปลง คุณวนซ้ำน้อยลงและคุณสามารถระมัดระวังน้อยลงเกี่ยวกับวิธีทดสอบรหัสของคุณ คุณยังสามารถบันทึกการดำเนินการประมวลผลและส่งไปให้ใครบางคนได้ดังนั้นจึงเป็นการดีสำหรับการค้นหาข้อบกพร่องในรหัสของผู้อื่น
speedplane

2

ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะขยายเพิ่มเติมเล็กน้อยเกี่ยวกับการแก้ไขจุดบกพร่อง "ย้อนกลับ" หรือ "ประวัติศาสตร์" นี้ ฉันคิดว่าการเข้าใจระบบและพฤติกรรมที่ซับซ้อนในการเล่น "เหตุการณ์" ใหม่ซึ่งทำให้รัฐชัดเจนเป็นสิ่งสำคัญอย่างยิ่ง

สิ่งที่ฉันต้องการแสดงคือคุณไม่ได้อยู่คนเดียวในการสงสัยว่าทำไมเทคนิคนี้จึงไม่ค่อยมีการนำมาใช้ในวันนี้

ดังนั้นเราขอเน้นแนวคิดที่สำคัญสองประการที่นี่:

1. เพื่อให้เข้าใจถึงระบบการเขียนโปรแกรมจะเป็นประโยชน์ในการทำให้สถานะชัดเจน

2. เพื่อให้เข้าใจระบบการเขียนโปรแกรมซ้ำลำดับของรัฐ (เหตุการณ์) สามารถช่วยได้มาก

ต่อไปนี้เป็นแหล่งข้อมูลบางส่วนที่จัดการปัญหาและเสนอหรือแก้ไขปัญหาที่เกิดขึ้น (จัดการกับสถานะในระบบที่ซับซ้อน):

- ออกจากบิต tar กระดาษ: http://shaffner.us/cs/papers/tarpit.pdf แนวคิดหลัก: หลีกเลี่ยงแยกหรือทำให้รัฐชัดเจน

-CQRS http://www.cqrs.nu/ นี่คือการรวมกันของสองแนวคิด: Command Query Segregation และ Event Sourcing มีการนำไปใช้งานที่แตกต่างกัน (Java, C #, Scala) การเล่นซ้ำของ Tate sequences และการพัฒนารูปแบบโดเมนเป็นส่วนสำคัญที่นี่

หากคุณจริงๆซูมออกและดูภาพกว้างมากแล้วคุณจะเห็นว่ามี "เพิ่มขึ้น" ของการทำงานคนเขียนโปรแกรมที่มีอยู่แล้ว ((UN) อย่างมีสติ) ดึงดูดให้ FP เพราะมันทำให้รัฐอย่างชัดเจน! แต่นั่นเป็นการจัดการกับประเด็นที่หนึ่งเพื่อจัดการกับประเด็นที่สองนั้นคุณจำเป็นต้องมีแนวคิดอื่นซึ่งอาจอธิบายได้ว่า "หลวม ๆ " เป็นการเขียนโปรแกรมปฏิกิริยาที่ใช้งานได้

ดังนั้นคุณอาจพูดได้ดีและดี แต่ใครใช้ CQRS และ FRP จริง ๆ ฉันจะพูด (IMO เพราะฉันไม่มีตัวเลขที่เป็นรูปธรรม) จริง ๆ แล้วมี บริษัท จำนวนมากที่พวกเขาไม่รู้จักงานที่พวกเขามีคำศัพท์นี้ บางทีคุณอาจจะลองไปฟังดูบ้างจากสถานประกอบการที่ใช้ CQRS แต่ก็มีเรื่องราวความสำเร็จอยู่แล้ว FRP ก็เพิ่มขึ้นอย่างช้าๆเช่นฉันจะให้ Netflix: http://techblog.netflix.com/2013/02/rxjava-netflix-api.html ซึ่งเพิ่งเปิดตัวการใช้งานของ RX ซึ่งจริงๆแล้วใช้. NET (แต่มี การใช้งานจาวาสคริปต์ด้วย) ดังนั้นผู้คนจึงใช้เทคนิคเหล่านี้ในวันนี้อยู่แล้วในขนาดใหญ่เพื่อทำความเข้าใจกับระบบที่ซับซ้อนและทำให้พวกเขาดียิ่งขึ้น นั่นคือเหตุผลที่พวกเขาใช้เทคนิคการดีบักแบบย้อนกลับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.