รหัสดีบั๊กควรอยู่ในตำแหน่งตลอดเวลาหรือเพิ่มเฉพาะเมื่อทำการดีบั๊กและลบออกเมื่อพบข้อบกพร่องหรือไม่


35

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

คุณจะทำอย่างไรมันได้หรือไม่? คุณปล่อยรหัสการดีบักไว้หรือลบออกเมื่อล้าสมัย (ซึ่งอาจเป็นการยากที่จะตัดสินเมื่อเป็น)

คำตอบ:


30

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


5
+1 เป็นหลักสำหรับการกล่าวถึงว่ามีกรอบการดีบักที่เหมาะสม หากสิ่งนี้อยู่ในตำแหน่งเริ่มต้นและมีระดับการดีบักต่าง ๆ รหัสการผลิตสามารถหวังว่าจะทำงานได้โดยไม่ต้องเรียกรูทีนการดีบักที่มีราคาแพงและรหัสการพัฒนาสามารถทำงานด้วยระดับการตรวจสอบใด ๆ ก็ตามที่ต้องการ
Orbling

1
เห็นด้วยกับ Orbling และเพิ่มเติมสำหรับรหัสการดีบักนอกเหนือจากการแสดงผลข้อมูลอย่างเดียวซึ่งมีผลกระทบต่อประสิทธิภาพการทำงานหรือเหตุผลอื่นไม่เหมาะสำหรับการผลิต (เช่น Assert บนผลลัพธ์ของฟังก์ชันเช่นการตรวจสอบผลลัพธ์ของการเรียงลำดับ) คุณอาจพิจารณาสองโหมดของเป้าหมายการสร้าง โหมดการแก้ปัญหาและโหมดการเปิดตัว
Zekta Chan

16

รหัสที่เพิ่มเข้ามาโดยเฉพาะสำหรับการแก้ไขข้อบกพร่องควรถูกลบออกจากซอฟต์แวร์การผลิต

ไม่ว่าจะเป็นการลบแบบสมบูรณ์หรือถูกใส่ไว้ในส่วนการรวบรวมตามเงื่อนไข (เช่นใน C / C ++ / C #) ขึ้นอยู่กับคุณและมาตรฐานการเข้ารหัสของคุณ

มีสาเหตุหลายประการ:

  1. อาจมีผลกระทบด้านความปลอดภัยหากมีการเรียกใช้รหัสนี้หรือใครบางคนสามารถเข้าถึงผลลัพธ์ได้
  2. อาจทำให้แอปพลิเคชันช้าลง
  3. มันอาจสร้างความสับสนให้กับนักพัฒนาคนอื่น ๆ ที่มองรหัส

+1 สำหรับการรวบรวมตามเงื่อนไข แต่บล็อกความคิดเห็นจะทำงานในภาษาที่ไม่รองรับ คุณไม่ควรปล่อยให้คอมไพล์ในรีลีสของ prod แต่บางครั้งมันก็ไม่มีประสิทธิภาพมากนักในการลบมันทิ้งทุกครั้งที่คุณต้องการที่จะปล่อยบิลด์รีลีส
Bill

1
ฉันทำงานในสภาพแวดล้อมที่มีการรวบรวมรหัส C / C ++ เสมอกับตัวเลือกการดีบักในกรณีที่รหัสการผลิตที่จำเป็นต้องทำการดีบั๊กหรือตรวจสอบ coredump บางครั้งสิ่งนี้พร้อมที่จะดีบั๊กอาณัติต้องการให้คำสั่งการดีบักถูกทิ้งไว้เพื่อให้สามารถเปิดใช้งานด้วยการตั้งค่าสถานะโดยไม่ต้องคอมไพล์รหัสใหม่ Java อนุญาตให้ทำการดีบั๊กได้เสมอหากมีการตั้งค่าตัวเลือก JVM ของคุณเพื่อให้การเตรียมการค่อนข้างน้อยจำเป็นต้องมีการดีบักสิ่งต่าง ๆ ในภายหลัง
Michael Shopsin

16

ChrisFและAlaricทั้งสองมีคะแนนที่ถูกต้อง; +1 สำหรับพวกเขา ฉันสามารถระบุรหัสการดีบักได้อย่างน้อย 5 ชนิดที่ฉันใช้

  1. การใช้บันทึกเพื่อถ่ายโอนข้อมูลสถานะระบบ ณ เวลาใดเวลาหนึ่ง

    void function(...)
    {
        ...dump everything i know about.
    }
    
  2. การใช้บันทึกสำหรับจุดตรวจสอบการดำเนินการ

    void function(...)
    {
        ...got here 1
        ...got here 2
    }
    
  3. รหัสที่จริงบังคับให้เงื่อนไขบางอย่างเป็นจริง แต่แบ่งพฤติกรรมปกติ ตัวอย่าง:

    • สมมติว่าคุณมีบันทึกที่เกี่ยวข้องกับข้อผิดพลาด แต่คุณไม่สามารถสร้างปัญหาขึ้นมาใหม่ได้ คุณอาจลองเขียนโค้ดที่บังคับให้ตัวแปรบางตัวมีค่าบางอย่างที่ตรงกับข้อมูลในบันทึก
  4. การบันทึกการตรวจสอบ - ฉันจะจัดประเภทนี้เป็นการบันทึกข้อมูล verbose ที่สามารถใช้ในการตรวจสอบความถูกต้องของซอฟต์แวร์ที่ไม่ควรรวมอยู่ในการผลิตเช่นการตรวจสอบขั้นตอนแต่ละขั้นตอนของอัลกอริทึม

  5. การดำเนินการเข้าสู่ระบบ - หมายถึงการโพสต์ของ Alaric นั่นคือสิ่งที่ฉันหมายถึงโดย "การบันทึกการดำเนินงาน"

1, 2 และ 3 ควรถอดออกโดยสมบูรณ์ บางอย่างเช่น 4 ฉันอาจรวบรวมจากรหัสเงื่อนไข สำหรับ 5, Alaricมีจุดที่ดีเกี่ยวกับความสามารถในการปิดล็อกแบบไดนามิก นั่นอาจกล่าวถึงประเด็นของ ChrisFในกระสุนนัดที่สองของเขาสำหรับกรณีส่วนใหญ่


1
นี่เป็นบทสรุปที่ดี อย่างไรก็ตามมันจะดีกว่าถ้าคุณสามารถจัดรูปแบบได้อย่างถูกต้องโดยแทนที่1)... ด้วย1.... (เพื่อให้การจัดรูปแบบ Markdown เลือกมันเป็นรายการ) และเยื้องรหัสตัวอย่าง 8 ช่องว่าง (อีกครั้งดังนั้น Markdown เลือกเป็นตัวอย่าง รหัสภายในรายการ)
Konrad Rudolph

@ Konrad Rudolph: เสร็จแล้ว
gablin

3

ขึ้นอยู่กับว่าโค้ดกำลังทำอะไร รหัสบางอย่างที่ใช้สำหรับการดีบักสามารถปล่อยไว้ตามที่ควรจะเป็นและควรลบบางรหัส

โค้ดที่ตรวจสอบความถูกต้องของพารามิเตอร์ในเมธอดนั้นไม่ได้มีประโยชน์เสมอไปเมื่อโค้ดทำงานอย่างถูกต้อง แต่ก็มักจะถูกเก็บไว้เพื่อให้แน่ใจว่ารหัสทำงานอย่างต่อเนื่อง

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

รหัสที่คุณเพิ่มเพียงเพื่อติดตามข้อผิดพลาดที่เฉพาะเจาะจงมักจะถูกลบออกหลังจากที่คุณพบข้อผิดพลาด


2

กาลครั้งหนึ่งฉันเคยใช้รหัสการดีบักจำนวนมาก ฉันเกือบจะกำหนดเป้าหมายไปที่ Windows ทั้งหมดดังนั้นจึงมีฟังก์ชั่นเอาท์พุทสตริงการดีบักจำนวนมากที่ฉันจำไม่ได้ว่าจะสะกดอะไรอีก

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

ความจริงก็คือแม้ว่ารหัสการดีบักทั้งหมดนั้นมีความพยายามอย่างมากสำหรับบางสิ่งที่ได้รับการจัดการอย่างสมบูรณ์แบบในวิธีที่แตกต่าง - แน่นอนว่าการใช้ดีบักเกอร์ ในตอนนั้นฉันไม่ประทับใจกับตัวดีบัก Borland C ++ เครื่องมืออยู่ที่นั่น แต่บ่อยครั้งพวกเขาให้ผลลัพธ์ที่ทำให้เข้าใจผิดและการใช้ดีบักเกอร์ที่ไม่ใช่ IDE (มักจำเป็น) หมายถึงการจดจำปุ่มลัดซึ่งหมายถึงการเบี่ยงเบนความสนใจจากงานที่ทำอยู่

ประสบการณ์การแก้ไขข้อบกพร่องเดียวที่ฉันพบว่าแย่กว่านั้นคือ GDB บรรทัดคำสั่ง

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

เมื่อถึงเวลาที่ฉันทำงานใน Visual Studio 7 แต่ก็ชัดเจนว่าการดีบักอาจใช้งานได้จริงและมีประสิทธิภาพ หากคุณสามารถทำการดีบักใน Visual Studio (รวมรุ่นด่วน) การดีบักเป็นเรื่องง่าย ไม่ต้องสงสัยเลยว่าถ้าคุณสามารถหาส่วนหน้า GUI / IDE ที่ถูกต้อง GDB นั้นก็ง่ายและมีประสิทธิภาพเช่นกัน แต่ฉันยังไม่ได้ทำการค้นหา

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

tool = cmake สำคัญอย่างไม่คาดคิดเครื่องมือสร้างที่ช่วยให้ฉันสามารถสลับระหว่างการสร้างสำหรับ GCC และ VC ++ ได้อย่างง่ายดายเหนือสิ่งอื่นใด ดังนั้นฉันสามารถทำการทดสอบหน่วยและครอบคลุม gcov โดยใช้ GCC แต่เปลี่ยนเป็น VC ++ ได้อย่างง่ายดายเพื่อใช้ดีบักเกอร์


ตัวดีบักอาจไร้ประโยชน์หากไม่ได้มีอันตรายในแอปพลิเคชันแบบมัลติเธรด แต่ฉันชอบความคิดเห็น flag-ish สีแดงของคุณ
Pemdas

@Pemdas - ฉันยังไม่ได้มีปัญหาร้ายแรงตามบรรทัดเหล่านั้นถึงแม้ว่าการใช้เธรดหลายตัวไม่ชัดเจนว่าเป็นมิตรกับการดีบัก ถึงกระนั้นฉันคิดว่าเครื่องมือที่เหมาะสมน่าจะเป็นทางออกที่ดีกว่าการแก้ไขข้อบกพร่องในหลักการ เครื่องมือวิเคราะห์แบบสแตติกที่สามารถมองเห็นสภาพการแข่งขันการหยุดชะงักเงื่อนไขเมื่อสองเธรดสามารถต่อสู้กับหน่วยความจำ / ทรัพยากรเดียวกันในเวลาเดียวกันและอื่น ๆ จะดี ฉันไม่รู้ว่ามีอะไรบ้างในสายเหล่านั้นแม้ว่าฉันจะรู้ว่ามีเครื่องมือที่ฉลาดอยู่ข้างนอก ตัวอย่างเช่น klee - ฉันไม่เข้าใจ แต่คำอธิบายพื้นฐานฟังดูน่าประทับใจมาก
Steve314

"ฉันคิดว่าเครื่องมือที่เหมาะสมน่าจะเป็นทางออกที่ดีกว่า debug code ในหลักการ" นั่นเป็นข้อความที่เป็นอันตราย;) มีเครื่องมือที่ preform การวิเคราะห์บางอย่างอาจดี แต่ฉันกังวลว่านักพัฒนาโดยเฉพาะอย่างยิ่งคนใหม่จะเริ่มพึ่งพาเครื่องมือเช่นคนที่ต้องใช้เครื่องคิดเลขเพื่อหาว่า 15% ของ 100 เป็นอย่างไร
Pemdas

การพึ่งพาเครื่องมือที่ฉันยังไม่ได้ค้นคว้า แต่ก็ไม่น่าเป็นไปได้ ในตัวอย่างเครื่องคิดเลขของคุณใช่ แต่ฉันจะยังคงใช้ OpenOffice Calc มากกว่าเขียนสเปรดชีตธรรมดาของฉันเอง มีเวลาสำหรับรหัสการแก้ปัญหา (แม้จะมีดีบักเกอร์ - เช่นกรณีการสร้างเงื่อนไขที่แปลกประหลาดของคุณเอง) แต่ถ้ามันเกินกว่าจุดที่กำหนดเครื่องมือที่มีอยู่ชนะ และเมื่อพูดถึงการลบ 15% จาก 115 ฉันจะใช้เครื่องคิดเลขเช่นกัน - สิ่งที่หลายคนจะให้ในขณะที่คำตอบที่ชัดเจน (100) นั้นผิด ในมัลติเธรดคำตอบที่ถูกต้องชัดเจนน่าอับอายสำหรับบางครั้งกลายเป็นผิด
Steve314

1

My take on it: Debug code ที่ใช้ฆ่า bug ภายในโค้ดที่เป็นปัญหาโดยทั่วไปแล้วฉันจะลบออกทั้งหมด รหัสการแก้ปัญหาที่ใช้ในการฆ่าแมลงที่เกิดจากแรงภายนอกฉันมักจะแสดงความคิดเห็น


-1

หากข้อผิดพลาดมาจากการทดสอบหน่วยหรือจากภายในรหัสการตรวจแก้จุดบกพร่องสามารถลบออกได้ทั้งหมด แต่ถ้าบั๊กมาจากการผลิตรหัสดีบั๊กจะอยู่ข้างในแท็กรวบรวม การวางไว้ในแท็กการคอมไพล์จะช่วยให้นักพัฒนาซอฟต์แวร์รายอื่นเข้าใจว่ารหัสนี้ใช้สำหรับการดีบักเท่านั้น


-1

ใช้TDDดังนั้นโค้ดทดสอบของคุณจะมีสถานที่ที่สม่ำเสมอ


คำถามนี้ถามคำถามนี้อย่างไร
ริ้น

เนื่องจาก TDD นำคุณไปสู่ ​​"debug" หรือรหัสทดสอบที่คุณไม่ต้องลบ
dukeofgaming

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