เปิดตัวบน HN: วัยรุ่นที่ทุ่มเวลา 6 เดือนสร้างดีบักเกอร์ภาษา C ตอนอายุ 17 ปี
(github.com/d4ckard)แนะนำดีบักเกอร์ Spray
- Spray เป็นดีบักเกอร์ที่เรียบง่ายและเข้าใจง่ายสำหรับโค้ด C
- มีความสามารถในการควบคุมการทำงานของโปรแกรมที่กำลังรัน รวมถึงตรวจสอบและแก้ไขสถานะได้
- เริ่มพัฒนาด้วยเป้าหมายเพื่อสำรวจความสงสัยเกี่ยวกับการทำงานภายในของดีบักเกอร์ และหาวิธีทำให้การดีบักเข้าถึงได้ง่ายขึ้น
ฟีเจอร์หลัก
- ตั้ง breakpoint ตามฟังก์ชัน, บรรทัดในไฟล์, หรือแอดเดรส
- แสดงผลและตั้งค่าค่าของตัวแปร, แอดเดรสหน่วยความจำ, และรีจิสเตอร์
- มี syntax highlighting สำหรับ C, backtrace และการรันทีละขั้น
- มีฟีเจอร์ฟิลเตอร์สำหรับกำหนดรูปแบบการแสดงผลของคำสั่ง
โรดแมปการพัฒนา
- แสดงผลและแก้ไข struct ที่ซับซ้อน
- syntax highlighting สำหรับ struct ที่ซับซ้อน
- backtrace ที่อิงกับ DWARF แทน frame pointer
- รองรับ inline function, การโหลดไลบรารีภายนอก, และการดักจับ signal ที่ส่งไปยังโปรแกรมที่กำลังดีบัก
วิธีติดตั้ง
- บางส่วนของฟรอนต์เอนด์ Spray เขียนด้วย Scheme และคอมไพล์เป็น C ผ่าน CHICKEN Scheme
- ต้องติดตั้ง CHICKEN และเนื่องจากมี dependency กับ libdwarf จึงต้องติดตั้งก่อน
- โคลนรีโพซิทอรีและติดตั้ง Spray ด้วยคำสั่ง
make - เพิ่มเข้า
$PATHเพื่อให้ใช้งานได้เหมือนคำสั่งทั่วไป
วิธีใช้ Spray
- ไบนารีที่จะดีบักต้องเปิดใช้ข้อมูลดีบักไว้ และต้องปิดการ optimize
- ต้องคอมไพล์โปรแกรมโดยใช้ Clang
- ส่งชื่อไบนารีที่จะดีบักเป็นอาร์กิวเมนต์ตัวแรก และส่งอาร์กิวเมนต์ของโปรแกรมที่จะดีบักต่อจากนั้น
คำสั่ง
การอ่านและเขียนค่า
- แสดงผลหรือตั้งค่าค่าของตัวแปร รีจิสเตอร์ และแอดเดรส
- ชื่อรีจิสเตอร์ใช้คำนำหน้า
%ตามไวยากรณ์แอสเซมบลีแบบ AT&T - ค่าสามารถระบุได้เป็นเลขฐาน 10 หรือฐาน 16
Breakpoint
- ตั้งและลบ breakpoint ตามฟังก์ชัน บรรทัดในไฟล์ หรือแอดเดรส
- ใช้คำสั่ง
continueเพื่อรันต่อไปจนถึง breakpoint ถัดไป
การรันทีละขั้น
- ไปยังบรรทัดถัดไป, เข้าไปในฟังก์ชัน, หรือออกจากฟังก์ชันปัจจุบัน
- ไปยังคำสั่งถัดไป และแสดง backtrace จากตำแหน่งปัจจุบัน
ฟิลเตอร์
- สามารถใช้ฟิลเตอร์เพื่อเปลี่ยนรูปแบบการแสดงผล
- แนบฟิลเตอร์ต่อท้ายคำสั่ง
printและsetเพื่อเปลี่ยนรูปแบบการแสดงผล
วิธีมีส่วนร่วม
- ยินดีรับทุกการมีส่วนร่วม โดยควรรัน local test suite ก่อนส่งพูลรีเควสต์เพื่อยืนยันว่าไม่ได้ทำให้ฟีเจอร์เสียหาย
- สามารถมองข้ามการทดสอบที่ล้มเหลวจากข้อผิดพลาดแบบ off-by-one กับค่าบางค่าได้
เอกสารอ้างอิง
- บล็อกซีรีส์ "Writing a Linux Debugger" ของ Sy Brand, มาตรฐาน DWARF 5, เอกสารของ libdwarf และโพสต์ "How debuggers work" ของ Eli Bendersky
ความเห็นของ GN⁺
ประเด็นสำคัญที่สุดของบทความนี้คือ Spray เป็นดีบักเกอร์ที่เป็นมิตรต่อผู้ใช้สำหรับโค้ด C และมุ่งเน้นการทำให้การดีบักเข้าถึงได้ง่ายขึ้น ด้วยโครงสร้างและคำสั่งที่เข้าใจง่ายแม้สำหรับวิศวกรซอฟต์แวร์ระดับเริ่มต้น จึงช่วยให้จัดการงานดีบักที่ซับซ้อนได้สะดวกยิ่งขึ้น นอกจากนี้ยังมีการนำเสนอโรดแมปการพัฒนาและวิธีมีส่วนร่วมไว้อย่างชัดเจน ทำให้เป็นโอกาสที่น่าสนใจสำหรับนักพัฒนาที่ต้องการเข้าร่วมโครงการโอเพนซอร์ส
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
โค้ดของโปรแกรมเมอร์วัยรุ่นคนนี้สะอาดเป็นพิเศษ สม่ำเสมอ และแยกเป็นโมดูลได้ดีมาก โปรเจ็กต์แบบนี้ต้องอาศัยความรู้ที่ไม่ธรรมดาเกี่ยวกับ binary format และ kernel API แม้แต่นักเขียนโปรแกรม "ระดับสูง" หลายคนก็อาจลำบากที่จะสร้างสิ่งแบบนี้ได้แม้ในระดับแนวคิดก็ตาม
การได้อ่านโค้ดของโปรแกรมเมอร์อายุน้อยเป็นเรื่องน่าสนใจ แม้ประสบการณ์จะยังน้อย แต่ก็เห็นได้ว่าพวกเขาออกแบบด้วยความรู้ในระดับสูงพอสมควร ดูเหมือนผู้เขียนจะเรียนรู้ได้เร็ว และผลงานจากการทำงาน 6 เดือนก็น่าประทับใจมาก
ชื่นชมในระดับความทุ่มเทแบบนี้ ขอแนะนำให้เข้าร่วมโปรแกรมอย่าง Google Summer of Code, KDE Season of Code, Linux Foundation LFX และ X.org EVoC เพราะมีปัญหาน่าสนใจให้ทำอีกมาก ตอนเป็นนักเรียนอยากรู้จักโปรแกรมพวกนี้ตั้งแต่ตอนนั้น ตอนนี้มีงานประจำเต็มเวลาแล้วเลยไม่มีเวลามีส่วนร่วมกับโอเพนซอร์ส
พอดูโปรเจ็กต์ครั้งแรกก็รู้สึกว่าจัดระเบียบมาอย่างดี น่าชื่นชม
ขอแสดงความยินดีกับโปรเจ็กต์และขอให้โชคดี คอมไพเลอร์เป็นหนึ่งในหัวข้อแรก ๆ ที่ทำให้สนใจการคอมพิวเตอร์
นี่แสดงให้เห็นว่าเด็กอายุ 17 ก็ยังรู้จัก CD อยู่เหมือนกัน ดังนั้นไอคอนบันทึกที่เป็นฟลอปปีดิสก์อาจยังไม่ล้าสมัยเสียทีเดียว
ความรู้และความเป็นผู้ใหญ่ที่แสดงออกมาในวัย 17 นั้นน่าประทับใจ หัวข้อที่ศึกษาและนำมาใช้เป็นสิ่งที่คาดหวังได้ในระดับมหาวิทยาลัย และโปรเจ็กต์นี้ก็น่าจะอยู่ในระดับหลักสูตรบัณฑิตศึกษา ขอให้ประสบความสำเร็จในเส้นทางอาชีพ
จำได้ว่าเคยใช้ Turbo Pascal เขียนไลบรารีกราฟิก 2D ตอนยังเด็ก สมัยก่อนที่จะค้นพบอินเทอร์เน็ต มันเลยจบลงแค่เป็นความสนุกส่วนตัว แต่คิดว่าคุณทำได้ดีแล้วที่สร้างบางอย่างให้คนอื่นได้เห็น โค้ดสะอาด คอมเมนต์ดี และ README ก็ชัดเจน
การทำบทสอน "เขียนดีบักเกอร์" ควบคู่ไปกับโปรเจ็กต์นี้อาจน่าเบื่อ แต่จะมีประโยชน์มาก
สงสัยว่าทำไมถึงเว้นวรรคระหว่างชื่อฟังก์ชันกับอาร์กิวเมนต์ ในฐานะคนที่อ่านโค้ด C มา 18 ปี มันให้ความรู้สึกแปลกตาอยู่พอสมควร
man styleแล้วลองใช้สไตล์นั้นดู