ทุกครั้งที่ฉันมองหา IDE (ปัจจุบันฉันกำลังใช้งาน Go) ฉันจะพบกระทู้ที่เต็มไปด้วยผู้คนที่แนะนำ Vi, Emacs, Notepad ++ เป็นต้น
ฉันไม่เคยทำการพัฒนาใด ๆ นอกเหนือจาก IDE; ฉันคิดว่าฉันใจแตก คุณจะดีบักโดยไม่มี IDE ได้อย่างไร คุณ จำกัด การเข้าสู่ระบบหรือไม่?
ทุกครั้งที่ฉันมองหา IDE (ปัจจุบันฉันกำลังใช้งาน Go) ฉันจะพบกระทู้ที่เต็มไปด้วยผู้คนที่แนะนำ Vi, Emacs, Notepad ++ เป็นต้น
ฉันไม่เคยทำการพัฒนาใด ๆ นอกเหนือจาก IDE; ฉันคิดว่าฉันใจแตก คุณจะดีบักโดยไม่มี IDE ได้อย่างไร คุณ จำกัด การเข้าสู่ระบบหรือไม่?
คำตอบ:
โดยใช้ตัวดีบัก ส่วนใหญ่แล้วนี่คือสิ่งที่ IDE ทำเบื้องหลัง - มันแค่ห่อประสบการณ์ใน GUI
บน Unix ซึ่งเป็นหนึ่งในจุดบกพร่องที่ใช้กันมากที่สุดคือ GNU gdb
ซึ่งได้แทนที่ส่วนใหญ่ก่อนหน้านี้ debuggers dbx
ยูนิกซ์เช่น
ที่จะได้รับความคิดของสิ่งที่ดูเหมือนว่าการแก้จุดบกพร่อง / รู้สึกเหมือนจากบรรทัดคำสั่งคุณสามารถดูคู่มือ gdb
ในขณะที่พื้นที่อื่น ๆ โดยใช้โปรแกรมดีบักจากบรรทัดคำสั่งต้องมีการเรียนรู้ไวยากรณ์และชุดของคำสั่ง แต่นำมาด้วยจำนวนมากของความยืดหยุ่นและ scriptability ในทางกลับกันถ้าคุณมีความสะดวกสบายในการทำงานในเอดิเตอร์เช่น vim หรือ emacs คุณอาจพบว่าเอดิเตอร์ที่คุณโปรดปรานมีปลั๊กอินสำหรับดีบักเกอร์ที่คุณชื่นชอบ
ipdb
ดีกว่านั้น;)
ฉันใช้ดีบักเกอร์เป็นเวลาหลายปีในขณะที่ฉันกำลังเขียนไดรเวอร์กราฟิก ฉันมีคอมพิวเตอร์เครื่องที่สองซึ่งรันตัวดีบักกับคอมพิวเตอร์เครื่องแรก (เนื่องจากหน้าจอในคอมพิวเตอร์หลักไม่ทำงานเมื่อไดรเวอร์กราฟิกเสีย) มันเป็นสิ่งสำคัญที่จะต้องสามารถหยุดโค้ดและขั้นตอนจนถึงจุดที่ฉันแขวนฮาร์ดแวร์เพื่อให้ฉันรู้ว่าเกิดอะไรขึ้น
สำหรับปัญหาซอฟต์แวร์หมดจดฉันพบว่าการคิดเกี่ยวกับปัญหาและทดสอบระบบเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับปัญหานั้นมีประโยชน์มากกว่าการก้าวผ่านโค้ดทีละบรรทัด ด้วยคำสั่งการพิมพ์ฉันมีรายการของทุกสิ่งที่เกิดขึ้นที่บรรทัดคำสั่งหรือไฟล์บันทึกที่ฉันสามารถดูและสร้างสิ่งที่เกิดขึ้นย้อนหลังและส่งต่อได้ง่ายกว่าที่ฉันเคยใช้ดีบักเกอร์
ข้อบกพร่องที่ยากที่สุดมักจะแก้ไขได้ด้วยการทำความเข้าใจปัญหาที่เกิดขึ้นจากคอมพิวเตอร์ บางครั้งมีกระดาษหรือไวท์บอร์ดและบางครั้งคำตอบก็เผยออกมาในขณะที่ฉันกำลังทำอย่างอื่นอยู่ ข้อบกพร่องที่ยากที่สุดได้รับการแก้ไขโดยดูที่รหัสอย่างละเอียดเช่นเล่น Where's Waldo ส่วนที่เหลือทั้งหมดดูง่ายที่สุดด้วยคำสั่งพิมพ์หรือคำสั่งบันทึก
คนที่แตกต่างกันมีสไตล์ที่แตกต่างกันและสไตล์ที่แตกต่างจะดีกว่าสำหรับงานที่แตกต่างกัน พิมพ์คำสั่งไม่จำเป็นต้องเป็นขั้นตอนลงจากดีบักเกอร์ ขึ้นอยู่กับสิ่งที่คุณกำลังทำ โดยเฉพาะอย่างยิ่งในภาษาที่ไม่มีการดีบักเกอร์แบบดั้งเดิม
going backwards
ทั้งหมดสำหรับ ฉันมักจะมีประสบการณ์: "เฮ้ - ไม่เป็นไรค่านี้ไม่ถูกต้อง! สิ่งนี้กลายเป็นสิ่งนี้ได้อย่างไร" และต้องย้อนกลับไปมาในขณะที่อ่านรหัส นักแก้จุดบกพร่องไม่ดีที่ด้านหลัง
บางคนใช้gdbที่บรรทัดคำสั่งหรือปลั๊กอิน นอกจากนี้ยังมีหน้าแบบสแตนด์อโลน GUI จบลงไป gdb เช่นDDD ขึ้นอยู่กับภาษาของคุณมี GUI ดีบักแบบสแตนด์อโลนเฉพาะภาษาเช่นWinpdbสำหรับ python หรือjswatสำหรับ java เพราะโครงการเหล่านี้มุ่งเน้นเพียงการแก้ไขข้อบกพร่องพวกเขามักจะดีกว่าแก้จุดบกพร่องแบบบูรณาการ
ความลับเล็ก ๆ น้อย ๆ ที่สกปรกเกี่ยวกับ IDE คือพวกเขาทั้งหมดมีค่าเกลือให้คุณระบุโปรแกรมแก้ไขแบบกำหนดเองเพื่อให้คุณสามารถใช้ชิ้นส่วนของ IDE สำหรับงานบางอย่าง แต่ใช้โปรแกรมแก้ไขที่ดีสำหรับการแก้ไข ไม่ใช่เรื่องแปลกที่จะใช้ IDE เพื่อใช้ดีบักเกอร์โดยเฉพาะอย่างยิ่งหากเป็นสิ่งที่เพื่อนร่วมงานของคุณใช้
บางภาษาเสนอ REPL - นั่นคือคุณสามารถเขียนและดำเนินการบรรทัดรหัสตามบรรทัดที่คุณเขียนซึ่งอาจเป็นขั้นตอนแรกในการตรวจสอบชิ้นส่วนของรหัส หลายสิ่งเหล่านี้ยังมีสิ่งอำนวยความสะดวกในการแก้ไขข้อบกพร่อง GHC สำหรับ Haskell มาพร้อมกับ GHCi ซึ่งสามารถใช้ในการดีบักแบบโต้ตอบในโปรแกรมในบรรทัดคำสั่งคล้ายกับที่ IDE ทำ
ฉันไม่เข้าใจว่าทำไมมีความเกลียดชังในการดีบักด้วยการใช้คำสั่ง printf มีเวลาที่ต้องใช้เวลาในการคอมไพล์ใหม่และเชื่อมโยงโปรแกรมนานเกินไป แต่วันนี้มันใช้เวลาเพียงไม่กี่วินาที ฉันพบว่ามันง่ายมากที่จะทำการ debug โดยใช้ cout, printf, qDebug (), ฯลฯ ชนิดของเอาต์พุต คำสั่ง Printf ให้ประวัติการใช้งานทุกอย่างที่โปรแกรมทำซึ่งคุณสามารถวิเคราะห์ได้หลังจากข้อเท็จจริงในขณะที่การเรียกใช้ในโปรแกรมดีบั๊กทำให้คุณต้องจำการไหลของโปรแกรมด้วยตนเอง ด้วย printf's คุณสามารถแปลงค่าของตัวแปรเป็นหน่วยที่เฉพาะเจาะจงแสดงในรูปแบบเลขฐานสิบหกทศนิยมอะไรก็ได้ คำสั่ง printf สามารถแสดงรายการชื่อของรูทีนและตัวแปรและหมายเลขบรรทัดได้เช่นกัน คุณสามารถแสดงรายการองค์ประกอบอาเรย์บางอย่างเท่านั้นโดยขึ้นอยู่กับตัวแปรอื่น ๆ คุณสามารถติดตามทิศทาง คุณสามารถควบคุมเอาต์พุตได้อย่างง่ายดาย ใส่ตัวนับพิมพ์เฉพาะบางครั้งผ่านลูปเพิ่มและลบคำสั่งการพิมพ์ขณะที่คุณดีบั๊กมีระดับการดีบั๊กเอาต์พุตเขียนไฟล์ ฯลฯ มันง่ายกว่ามากในการดูประวัติของโปรแกรมที่เขียนลงไฟล์ พยายามจดจำสถานที่ทั้งหมดที่คุณก้าวผ่านด้วยตนเองและอาจต้องเขียนเนื้อหาของตัวแปรตามที่เปลี่ยนแปลงไปตามกาลเวลาเพื่อค้นหาสิ่งที่โปรแกรมทำ และสุดท้ายด้วยคำสั่ง printf คุณสามารถปล่อยไว้ในแบบถาวรเพื่อเปิดและปิดสำหรับการดีบักในอนาคต ดูประวัติโปรแกรมของคุณที่เขียนลงไฟล์ได้ง่ายกว่าที่จะจำสถานที่ทั้งหมดที่คุณก้าวผ่านด้วยตนเองและอาจต้องเขียนเนื้อหาของตัวแปรตามที่เปลี่ยนแปลงไปตามเวลาเพื่อค้นหาว่าโปรแกรมใดบ้าง ได้ทำ และสุดท้ายด้วยคำสั่ง printf คุณสามารถปล่อยไว้ในแบบถาวรเพื่อเปิดและปิดสำหรับการดีบักในอนาคต ดูประวัติโปรแกรมของคุณที่เขียนลงไฟล์ได้ง่ายกว่าที่จะจำสถานที่ทั้งหมดที่คุณก้าวผ่านด้วยตนเองและอาจต้องเขียนเนื้อหาของตัวแปรตามที่เปลี่ยนแปลงไปตามเวลาเพื่อค้นหาว่าโปรแกรมใดบ้าง ได้ทำ และสุดท้ายด้วยคำสั่ง printf คุณสามารถปล่อยไว้ในแบบถาวรเพื่อเปิดและปิดสำหรับการดีบักในอนาคต
jimwise ตอบคำถามได้ดีทีเดียว แต่ฉันคิดว่าฉันควรเพิ่มว่าคุณควรเลือกที่จะทำงานได้โดยไม่ต้อง IDE เต็มไมโครซอฟท์มีให้คำสั่งดีบักบรรทัดสำหรับ Windows เรียกว่าCDB CDB มาพร้อมกับเครื่องมืออื่น ๆ รวมถึงWinDBGซึ่งเทียบเท่ากับ GUI เมื่อคุณดาวน์โหลด Windows SDK
ฉันมักจะไม่ใช้ดีบักเกอร์บางทีทุกๆสองสามสัปดาห์ แต่ไม่ใช่สิ่งแรกที่ฉันไป
เครื่องมือที่สำคัญที่สุดในงานของฉันคือแพร่หลายจนฉันเกือบลืมพูดถึง - ร่องรอยสแต็ค กว่า 90% ของปัญหาที่ฉันพบสามารถแก้ไขได้โดยการตรวจสอบการติดตามสแต็ก เครื่องมือนี้ไม่ได้มีประโยชน์เสมอไปทั้งนี้ขึ้นอยู่กับภาษาของคุณ แต่เมื่อใช้งานได้ดีกับภาษาพวกเขาจะสามารถประหยัดเวลาได้อย่างน่าทึ่ง
ฉันเดาวิธีทั่วไปที่สองที่ฉันตรวจพบปัญหาง่ายๆคือมันอาจเป็นรหัสที่ฉันเพิ่งเปลี่ยน ฉันเรียกใช้การทดสอบหน่วยบ่อย ๆ ดังนั้นโดยทั่วไปฉันรู้ว่าสิ่งที่ฉันยากจน
สำหรับการพัฒนาและการดีบักที่ซับซ้อนยิ่งขึ้นฉันอาจเพิ่มคำสั่งบันทึกการดีบักหรือการติดตามระดับบางอย่าง ฉันพิจารณาปัญหาการพัฒนาคู่มือที่ดีเพื่อช่วยฉันวางข้อมูลการติดตามการผลิต / การดีบักซึ่งทำให้ฉันไปที่:
คุณไม่ได้ใช้ดีบักเกอร์เสมอไป ในการผลิตอาจเป็นไปไม่ได้เลยที่จะเรียกใช้ดีบักเกอร์ (Heck มันอาจเป็นไปไม่ได้ที่จะเข้าถึงเครื่องที่ใช้งานจริงยกเว้นบันทึกขึ้นอยู่กับความปลอดภัยของ บริษัท ของคุณ) นอกจากนี้ยังมีภาษาที่การต่อเชื่อมดีบักเกอร์ใช้เวลานานเกินไปหรืออาจจะมีเพียงไม่ดีที่ debuggers
หากคุณได้รับการเข้ารหัสตลอดการใช้ตรรกะและการบันทึกระดับ debug / ติดตามก็สามารถเป็นกรณีของการตรวจสอบงบบันทึกที่ยอดเยี่ยมของคุณ (อาจเพิ่มระดับการบันทึก) เพื่อหาปัญหาโดยไม่ต้องเข้าถึงฮาร์ดแวร์
แม้ว่าฉันคิดว่าเครื่องมือดีบั๊กเป็นเครื่องมือที่ทรงพลัง แต่อย่าให้มันเป็นเครื่องมือเดียวในกล่องเครื่องมือของคุณ!
ไม่มีเหตุผลใดที่คุณไม่สามารถใช้ดีบักเกอร์ใน IDE ควบคู่ไปกับเครื่องมือแก้ไขข้อความแบบสแตนด์อโลน ฉันเคยใช้! Zap เพื่อแก้ไข JBuilder เพื่อแก้ไขข้อบกพร่องในเครื่องอื่นและไฟล์เซิร์ฟเวอร์ในห้องใต้ดิน โปรแกรม debuggers แบบดั้งเดิมนั้นเป็นโปรแกรมแบบสแตนด์อโลนโดยไม่ต้องลากไปตาม IDE และก็ใช้ได้เช่นกัน
เป็นที่น่าสังเกตว่าการทดสอบที่ครอบคลุมช่วยแก้จุดบกพร่องได้ การพิจารณาจุดบกพร่องที่รายงานจะเป็นข้อบกพร่องในการทดสอบของคุณแทนที่จะเป็นในโค้ดของคุณ
printf
นอกจากนี้ยังมี มันจะมีประโยชน์ในการสร้าง "การบันทึก" จำนวนมากและค้นหาผ่านแทนที่จะหยุดทุกบรรทัด ฉันพบว่ามีประโยชน์อย่างยิ่งหากคุณสามารถปรับเปลี่ยนคลาสไลบรารีที่คุณจะไม่สามารถปรับเปลี่ยนในการผลิตเช่นใช้-Xbootclasspath/p:
เพื่อแฮ็คคลาสไลบรารี Java
ยอมรับว่าปัญหาที่ดีที่สุดสามารถแก้ไขได้จากคอมพิวเตอร์ด้วยปากกาและกระดาษหรือเพียงแค่คิดถึงปัญหา สิ่งนี้มีประโยชน์มากกว่าการใช้การดีบักแบบสด มันมักจะแก้ไขกระบวนการคิดของคุณ
คุณสามารถใช้pudbซึ่งเป็นคอนโซลที่มีส่วนต่อประสานผู้ใช้อย่างง่าย คุณสามารถเลือกดีบักเกอร์ที่คุณต้องการเช่น pdb หรือ ipdb ถ้าคุณต้องการป้อน REPL และตรวจสอบรายละเอียดเพิ่มเติม
นอกจากนี้โปรดตรวจสอบPythonDebuggingTools Wiki เพื่อรับชุดเครื่องมือที่ครอบคลุมมากขึ้น