จุดบกพร่องในซอฟต์แวร์สามารถก่อกวน เข้าใจยาก น่ารังเกียจ และรุกรานได้ แท้จริงแล้ว นักพัฒนามักต้องการความเหนียวแน่นของ Edison เพื่อค้นหาและแก้ไขปัญหา
แต่ความเพียรไม่ใช่ทรัพย์สินเพียงอย่างเดียวที่นักพัฒนาต้องการ สิ่งหนึ่งที่ต้องการข้อมูลเพื่อแก้ไขโค้ด:อาการและผลกระทบของปัญหาคืออะไร? ความถี่ของมันคืออะไร? ความแพร่หลาย? ที่มา? หลักฐานและสิ่งประดิษฐ์ของจุดบกพร่อง เช่น ดัมพ์หลัก การติดตามสแต็ก บันทึก หรือกรณีทดสอบ มีคุณค่าอย่างยิ่ง
เรามาสำรวจเทคนิคและเครื่องมือบางประการที่นักพัฒนา Ruby และ Rails พร้อมใช้งานเพื่อรวบรวมและตรวจสอบหลักฐานของปัญหา ข้อมูลไม่สามารถทดแทนความดื้อรั้นได้ แต่สามารถช่วยบรรเทาความพยายามของคุณได้ (และช่วยให้คุณนอนหลับได้)
Rails มีเครื่องมือที่ยอดเยี่ยมในการตรวจดูแอปพลิเคชันที่ทำงานอยู่ รวมถึง Logger ที่กำหนดค่าได้เพื่อบันทึกการวินิจฉัยของตัวมันเองและทุก ๆ ที่คุณต้องการเพิ่ม Rails ยังจัดทำบันทึกการสืบค้นแบบละเอียดเพื่อระบุที่มาของการสืบค้นฐานข้อมูลและบันทึกการเข้าคิวแบบละเอียดเพื่อชี้แจงตำแหน่งงานพื้นหลังที่ถูกจัดคิว บันทึกสองรายการหลังเปิดใช้งานตามค่าเริ่มต้นใน 06 สภาพแวดล้อม;คุณสามารถเปิดใช้งานทั้งในสภาพแวดล้อมอื่นได้ด้วยสองคำสั่ง
ตัวเลือกบันทึกที่ไม่ค่อยมีคนรู้จักมีให้ใช้งานเนื่องจาก Rails 7 จะใส่คำอธิบายประกอบแต่ละแบบสอบถาม SQL พร้อมความคิดเห็น หากคุณเพิ่มสิ่งต่อไปนี้ใน 13 หรือไฟล์สภาพแวดล้อมใดๆ:
บันทึกการสืบค้นของคุณได้รับการแก้ไขโดยอัตโนมัติด้วยชื่อแอปพลิเคชัน ชื่อตัวควบคุม ชื่อการดำเนินการ หรือชื่องานพื้นหลัง ผลลัพธ์ตัวอย่างต่อไปนี้มาจากคู่มือการดีบักของ Rails โดยตรง:
คุณอาจไม่ต้องการเปิดใช้งานคุณลักษณะเหล่านี้ทั้งหมดในการผลิต การสร้างบันทึกอาจมีค่าใช้จ่ายสูงในแง่ของหน่วยความจำและเวลา (ทรัพยากรที่มีจำกัดสำหรับแอปพลิเคชันภายใต้ภาระงาน)
อย่างไรก็ตาม มีข้อยกเว้นอยู่ คุณอาจต้องการเปิดใช้งานคุณสมบัติตามความต้องการโดยเฉพาะอย่างยิ่งเมื่อทำการดีบักโหมดการพัฒนาและทดสอบ แทนที่จะแก้ไขโค้ด (และอาจปรับใช้ใหม่) เพื่อเปิดใช้งานหรือปิดใช้งานการวินิจฉัย ให้ใช้ตัวแปรสภาพแวดล้อมเพื่อควบคุมสถานะ สภาพแวดล้อมในบางสภาพแวดล้อม เช่น Heroku การเปลี่ยนการตั้งค่าของตัวแปรสภาพแวดล้อมไม่ได้บังคับให้มีการปรับใช้ใหม่
ตัวอย่างเช่น คุณสามารถกำหนดชุดตัวแปรเพื่อควบคุมการบันทึกและการใช้คำฟุ่มเฟือยได้
เพื่อความสะดวก ให้สร้างคลาสขนาดเล็กเพื่อค้นหาการตั้งค่าการกำหนดค่า
ตอนนี้ใช้ตัวแปรและโค้ดเพื่อตั้งค่าคุณลักษณะการบันทึกใน 23 :
ใช้เชลล์ ไฟล์ dotenv การบูรณาการอย่างต่อเนื่อง หรือการโฮสต์และแพลตฟอร์มการปรับใช้งานเพื่อตั้งค่าแต่ละตัวเลือก คุณยังสามารถใช้คุณสมบัติตามความต้องการได้ เพียงแค่เริ่มต้นแอปพลิเคชันด้วยตัวแปรสภาพแวดล้อมที่กำหนดไว้ในบรรทัดคำสั่ง
ปรับแต่ง Puma เพื่อการพัฒนา
จากส่วนก่อนหน้านี้ เรามาดูวิธีใช้ตัวแปรสภาพแวดล้อมเพื่อปรับแต่งการกำหนดค่า Puma ของคุณสำหรับการดีบักในสภาพแวดล้อมการพัฒนา
โดยทั่วไปแล้ว Puma ได้รับการกำหนดค่าเพื่อเพิ่มปริมาณงานในการผลิตให้สูงสุด ใช้งานพนักงานหลายคน และหลายเธรดต่อพนักงาน ในการพัฒนา คุณต้องการสิ่งที่ตรงกันข้าม:ผู้ปฏิบัติงานหนึ่งคน หนึ่งเธรด และการหมดเวลานานมากเพื่อให้สามารถแก้ไขจุดบกพร่องเชิงโต้ตอบได้ แต่ละรายการเป็นพารามิเตอร์ที่คุณสามารถปรับแต่งได้
แก้ไข 32 เพื่อสะท้อนถึงรหัสต่อไปนี้
ตอนนี้คุณสามารถกำหนดค่าตัวแปรสภาพแวดล้อมทั้งสามเพื่อควบคุม Puma ในแต่ละสภาพแวดล้อมได้ ในการพัฒนา ให้ตั้งค่าเพื่อปรับให้เหมาะสมสำหรับการดีบักเชิงโต้ตอบ
หากคุณต้องการตรวจสอบการตั้งค่า Puma ให้ตั้งค่าตัวแปรสภาพแวดล้อม45 และเริ่มการสมัครของคุณ Puma ปล่อยการกำหนดค่าที่ใช้งานอยู่เมื่อเริ่มต้นระบบ
บังเอิญที่การกำหนดค่าเริ่มต้นของ Puma ใน Rails รุ่นล่าสุดนั้นคล้ายกับที่แสดงไว้ที่นี่ (ขอบคุณ Nate Matykiewicz สำหรับคำแนะนำ)
เรียกใช้งานพื้นหลังแบบอินไลน์
แอปพลิเคชัน Rails ที่มีความซับซ้อนใดๆ มักจะใช้ประโยชน์จากงานเบื้องหลังเพื่อรันงานที่ต้องใช้การประมวลผลสูงและ (ค่อนข้าง) ที่ต้องใช้เวลานาน งานเบื้องหลังทำงานแบบอะซิงโครนัส ตัดการเชื่อมต่อจากวงจรคำขอ/ตอบกลับ ตัวเลือกที่เหมาะสมที่สุดสำหรับการประมวลผลแบบ "นอกขอบเขต" ได้แก่ การสร้างรายงาน การส่งอีเมล และการโต้ตอบกับ API ของบริษัทอื่น แต่ลักษณะของงานแบบอะซิงโครนัสยังทำให้การดีบักยุ่งยากอีกด้วย
เพื่อให้การแก้ไขปัญหาง่ายขึ้น ให้เรียกใช้งานทันที ในการพัฒนาท้องถิ่นและสภาพแวดล้อมการทดสอบของคุณ ในโหมดเร่งด่วน งานจะไม่อยู่ในคิว แต่จะดำเนินการทันที การทำงานใน "เบื้องหน้า" ทำให้คุณสามารถตั้งค่าเบรกพอยท์และตรวจสอบสถานะแบบโต้ตอบได้
มาดูตัวอย่างการใช้ Delayed Job ซึ่งเป็นแบ็กเอนด์การเข้าคิวยอดนิยมและจัดการง่ายสำหรับ Active Job งานล่าช้าให้การตั้งค่าเพื่อเปิดใช้งานการจัดคิว ตามค่าเริ่มต้น การตั้งค่าคือ 55 และงานก็เข้าคิวตามปกติ อย่างไรก็ตาม หากตั้งค่าเป็น 69 , งานจะดำเนินการทันที
เพิ่มรหัสต่อไปนี้ลงในแอปพลิเคชันของคุณใน 73 :
ถ้า 88 ถูกตั้งค่าเป็นค่าใดๆ การเข้าคิวจะถูกปิดใช้งาน หากตัวแปรสภาพแวดล้อมว่างเปล่าหรือไม่ได้กำหนดไว้ การเข้าคิวจะถูกเปิดใช้งาน
จากนั้น ในเชลล์ บนบรรทัดคำสั่ง หรือในไฟล์ dot ให้ตั้งค่า99 ตามความจำเป็น
ตั้งค่าตัวแปรสภาพแวดล้อมเป็นศูนย์หรือลบตัวแปรสภาพแวดล้อมเพื่อเรียกคืนการจัดคิว
ไม่มีกฎเกณฑ์ในการตั้งชื่อตัวแปรสภาพแวดล้อม เลือกชื่อที่มีความหมายต่อคุณ รูปแบบที่เป็นประโยชน์อย่างหนึ่งในการจัดหมวดหมู่ตัวแปรคือการเพิ่มชื่อแพ็กเกจเป็นคำนำหน้า เช่น 108 และ 110รหัส> . อดีตบ่งบอกถึงตัวแปรที่ส่งผลต่อ Puma; ส่วนหลังหมายถึงตัวแปรที่ใช้โดยงานล่าช้า
เพียร์เข้าสู่การโทรผ่านเครือข่าย
เช่นเดียวกับงานเบื้องหลัง แอปพลิเคชัน Rails ยังสามารถใช้ applicationprogramming interfaces (API) ได้อีกด้วย API ให้การเข้าถึงบริการภายนอก เช่น ฐานข้อมูล GraphQL ธุรกรรมอีคอมเมิร์ซ และแหล่งข้อมูลสาธารณะ
นี่เป็นอีกตัวอย่างหนึ่งในการส่งคำขอและการตอบกลับ HTTP แบบมีเงื่อนไขจาก 121 ห้องสมุด หากตัวแปรสภาพแวดล้อม 134 ถูกตั้งค่าเป็นค่าที่ไม่เว้นว่าง คำขอขาออกและการตอบกลับขาเข้าจะพิมพ์เป็น 148 .
หากต้องการดูกิจกรรมเครือข่าย เพียงเริ่มต้นแอปพลิเคชันด้วยตัวแปรสภาพแวดล้อมที่กำหนดไว้ในบรรทัดคำสั่ง
158รหัส> วิธีการจัดเตรียมสิ่งที่เป็นนามธรรมจากการใช้งานactualflag มันและโค้ดที่เหลือนี้สามารถสร้างคลาสพื้นฐานสำหรับคำขอเครือข่ายทั้งหมดของคุณได้ ดังที่แสดงในส่วนสำคัญนี้ที่นำมาจากโค้ดที่ใช้งานจริง
จักรวาลของอัญมณี Ruby นั้นกว้างใหญ่:เป็นไปไม่ได้ที่จะครอบคลุมอัญมณีที่ยอดเยี่ยมทั้งหมดที่มีให้สำหรับการแก้ไขจุดบกพร่อง มาดูเครื่องมือบางอย่างที่คุณสามารถเพิ่มได้ในวันนี้เพื่อเพิ่มพลังทันที คุณอาจจะเพิ่มแต่ละสิ่งเหล่านี้ลงในโครงการทั้งหมดของคุณ
-
160รหัส> และ172รหัส> สร้างการตรวจสอบโครงสร้างข้อมูล Ruby ที่สมบูรณ์และอ่านง่าย รวมถึงโมเดล Active Record คุณสามารถใช้โค้ด gemin หรือจากคอนโซลก็ได้นี่คือตัวอย่างของแบบจำลองที่ปล่อยออกมาโดย
181ในคอนโซล:แทนที่จะเป็น
197ให้ใช้200เพื่อแสดงผลลัพธ์ที่ได้รับการปรับปรุง สุดยอดการพิมพ์ listattributes ตามลำดับตัวอักษร หนึ่งแอตทริบิวต์ต่อบรรทัด รวมถึงคุณสมบัติอื่นๆ -
213รหัส> แทนที่หน้าข้อผิดพลาด Rails มาตรฐานด้วย stack backtrace ที่ปรับปรุง รายการพารามิเตอร์ และคอนโซลแบบโต้ตอบ ซึ่งคุณสามารถตรวจสอบเฟรมสแต็กและตัวแปรในฉากของข้อยกเว้น คุณยังสามารถผูกลิงก์ซอร์สโค้ดเข้ากับโปรแกรมแก้ไขรายการโปรดของคุณได้ นี่คือโค้ดที่จะผูก227เป็นรหัส Visual Studio:เรียกใช้
231ในเชลล์ของคุณแล้วรีสตาร์ทเซิร์ฟเวอร์ Rails ตอนนี้ลิงก์ไปยังไฟล์ที่เปิดโดยอัตโนมัติใน Visual Studio -
เก็บ
240ไว้ และ258gems (หรือทางเลือกอื่น) ทั้งในกลุ่มการทดสอบและการพัฒนาใน Gemfile . ทั้งสองอย่างมีคุณค่าอย่างยิ่งหากคุณต้องการสร้างข้อมูลอย่างรวดเร็วในคอนโซล
แนวคิดอีกอย่างหนึ่ง:หากคุณใช้ AppSignal เป็นเครื่องมือตรวจสอบแอปพลิเคชัน AppSignal จะมีคุณลักษณะในการตีความบันทึกของคุณและระบุแหล่งที่มาของข้อผิดพลาด โปรดดูรายละเอียดเพิ่มเติมในการดีบักใน Ruby ด้วย AppSignal
การดีบักเป็นทักษะ
การแก้ไขโค้ดเป็นงานศิลปะ และเช่นเดียวกับความพยายามสร้างสรรค์ใดๆ ยิ่งคุณฝึกฝนมากเท่าไร คุณก็ยิ่งเก่งขึ้นเท่านั้น
แก้ไขข้อบกพร่องขณะจับคู่กับนักพัฒนารายอื่น โดยเฉพาะนักพัฒนาที่มีประสบการณ์ หากคู่ของคุณเต็มใจ คิดออกมาดังๆ ร่วมกันและแลกเปลี่ยนลางสังหรณ์และข้อมูลเชิงลึก
ออกไปแฮ็ค!
ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว! ป>
มาร์ติน สไตรเชอร์
Martin ผู้เขียนรับเชิญของเราเป็นนักพัฒนา Ruby มืออาชีพ เขาได้รับปริญญาขั้นสูงสาขาวิทยาการคอมพิวเตอร์จากมหาวิทยาลัย Purdue ดำรงตำแหน่งบรรณาธิการบริหารของนิตยสาร Linux (สหรัฐอเมริกา) เป็นเวลาห้าปี และเป็นผู้เขียนผู้ก่อตั้งคอลัมน์ "Speaking in Unix" ที่ตีพิมพ์ในพอร์ทัล DeveloperWorks ของ IBM ในอดีต เมื่อไม่ได้เขียนโค้ดหรือเขียนเกี่ยวกับโค้ด เขาจะสะสมงานศิลปะและต่อสู้กับสุนัขตัวเล็กจำนวนมาก
บทความทั้งหมดโดย Martin Streicher