Seer: GUI ฟรอนต์เอนด์สำหรับ GDB บน Linux
(github.com/epasveer)- Seer เป็นฟรอนต์เอนด์สำหรับ ควบคุม GDB ผ่าน GUI บน Linux และกำลังพัฒนาอย่างต่อเนื่องโดยมีเป้าหมายเป็น GUI สำหรับ GDB ที่เรียบง่ายและดูดี
- สามารถติดตั้งได้ผ่านตัวจัดการแพ็กเกจหรือบิลด์จากซอร์ส โดยมีข้อกำหนดคือ Linux, C++17, GDB ที่รองรับ MI interpreter, CMake 3.5.0 ขึ้นไป, Qt6
- Qt5 ไม่สามารถคอมไพล์กับซอร์สทรีล่าสุดได้อีกต่อไป โดย ซอร์สทรี 2.3 เป็นทรีสุดท้ายที่คอมไพล์ด้วย Qt5 ได้ และ v1.17 เป็นรีลีสสุดท้ายที่ใช้ Qt5
- Seer มีการใช้งานผ่าน GUI สำหรับการเรียกดูซอร์ส, การแสดงตัวแปรและรีจิสเตอร์, การจัดการ breakpoint, watchpoint, catchpoint, printpoint, การดู stack และ thread รวมถึง GDB reverse debugging
- ฟีเจอร์เพิ่มเติมมีทั้งมุมมอง assembly, การแสดงภาพ memory, array, struct, image และคอนโซล I/O ของโปรแกรมที่รัน ทำให้จัดการงานดีบักด้วย GDB ได้แบบมองเห็นภาพ
ภาพรวมโปรเจกต์
- Seer เป็น GUI ฟรอนต์เอนด์ของ GDB สำหรับ Linux
- เป้าหมายคือการ提供 GUI ที่เรียบง่ายและดูดี สำหรับ GDB
- โปรเจกต์กำลังพัฒนาอย่างต่อเนื่อง หากพบ bug หรือต้องการฟีเจอร์ สามารถแจ้งได้ทางอีเมลหรือ GitHub issue
การติดตั้งและข้อกำหนด
- Seer สามารถติดตั้งได้ผ่าน ตัวจัดการแพ็กเกจ หรือ บิลด์จากซอร์ส
- ข้อกำหนด:
- Linux
- C++17
- GDB ที่รองรับ
miinterpreter- คำสั่งตรวจสอบ:
gdb --interpreter=mi
- คำสั่งตรวจสอบ:
- CMake 3.5.0 ขึ้นไป
- Qt6
- เมื่อบิลด์จากซอร์ส ต้องมีแพ็กเกจพัฒนาของ Qt6 ที่เหมาะกับดิสทริบิวชัน
- โมดูล Qt6 ที่จำเป็นคือ Core, Gui, Widgets, PrintSupport, Charts, Svg
- คู่มือการบิลด์ Qt6: Building Seer - Qt6
- ข้อจำกัดเกี่ยวกับ Qt5:
-
Seer ไม่สามารถคอมไพล์ด้วย Qt5 ได้อีกต่อไป
- ซอร์สทรี 2.3 เป็นทรีสุดท้ายที่คอมไพล์ด้วย Qt5 ได้
- คู่มือการบิลด์ Qt5: Building Seer - Qt5
-
ช่องทางติดตั้งแพ็กเกจ
- Pamac บน Manjaro:
pamac install seer
- zypper บน openSUSE Tumbleweed:
zypper install seergdb
- Flathub:
- io.github.epasveer.seer
flatpak install flathub io.github.epasveer.seer
- เวอร์ชันเบต้าของ Flatpak:
- Seer release page
- ดาวน์โหลด
seer.flatpakแล้วติดตั้ง - หากต้องการรัน GDB จาก
GDB Launcherจำเป็นต้องใช้flatpak-spawn --host
รีลีสและการย้ายไปใช้ Qt
- สามารถดูข่าวสารล่าสุดได้ที่ Seer Wiki
- v1.17 เป็นรีลีสสุดท้ายของ Qt5
- รีลีสถัดไปคือ v2.0 และใช้ Qt6 เป็นพื้นฐาน
- ในช่วงหนึ่งยังคอมไพล์ด้วย Qt5 ได้ แต่หากต้องการซอร์ส Qt5 เวอร์ชันเสถียรล่าสุด ควรใช้ v1.17
วิธีเรียกใช้งาน
- Seer ถูกสร้างมาเพื่อให้เริ่มโปรแกรมที่จะดีบักจาก command line ได้ง่าย
- เนื่องจาก GDB รองรับการดีบักโปรแกรมได้หลายวิธี Seer จึงมีรูปแบบการเรียกใช้งานหลายแบบด้วย
- ดูวิธีเริ่มใช้งานได้ที่วิกิ Starting Seer
องค์ประกอบของ GUI หลัก
-
Source/Function/Types/Variables/Libraries
- แสดงรายการไฟล์ซอร์สและไฟล์ header ที่ใช้ในโปรแกรม
- สามารถค้นหาฟังก์ชัน, type และตัวแปร static ได้
- ดับเบิลคลิกเพื่อเปิดไฟล์ซอร์สได้
- แสดงรายการ shared library ที่โปรแกรมอ้างอิง
- รายการไฟล์ซอร์สและ header สามารถลดจำนวนรายการที่แสดงด้วยการค้นหาได้
-
Variable/Register Info
- แสดงค่าตัวแปรและรีจิสเตอร์
- Logger บันทึกค่าตัวแปร
- Tracker แสดงค่าของตัวแปรที่กำหนดทุกครั้งที่ GDB ไปถึงจุดหยุด เช่น step, next, finish
- Registers แสดงค่าของรีจิสเตอร์ CPU ทั้งหมด
-
Code Manager
- เป็นพื้นที่ขนาดใหญ่ตรงกลางของ Seer GUI และแสดงไฟล์ซอร์สเป็นแท็บ
- ใช้
^Fเพื่อค้นหาข้อความในไฟล์ได้ - ดับเบิลคลิกชื่อตัวแปรเพื่อเพิ่มเข้า Logger ได้
- ดับเบิลคลิกพร้อม
CTRLจะเติม*ไว้หน้าตัวแปร - ดับเบิลคลิกพร้อม
SHIFTจะเติม&ไว้หน้าตัวแปร - ดับเบิลคลิกพร้อม
CTRL+SHIFTจะเติม*&ไว้หน้าตัวแปร
- ดับเบิลคลิกพร้อม
- ใช้เมนูคลิกขวาเพื่อเพิ่มตัวแปรเข้า Tracker หรือ Memory Visualizer ได้
- สามารถสร้าง breakpoint หรือ printpoint ที่บรรทัดใดบรรทัดหนึ่งได้
- สามารถรันจนถึงบรรทัดที่กำหนดได้
- แท็บสามารถแยกออกมาได้ด้วยการดับเบิลคลิก
การควบคุมการดีบักและการดูสถานะการรัน
- พื้นที่ด้านล่างจัดการ breakpoint, watchpoint, catchpoint, printpoint, คำสั่ง GDB แบบแมนนวล และ log
- ในแท็บคำสั่งแบบแมนนวล สามารถป้อนคำสั่ง GDB หรือ GDB/MI ได้โดยตรง
- คำสั่งที่ป้อนจะถูกจำไว้สำหรับการใช้งาน Seer ครั้งถัดไป
- Breakpoint manager ใช้สร้างและจัดการ breakpoint
- Watchpoint manager ใช้เฝ้าดูการเข้าถึงตัวแปร
- สามารถเฝ้าดูการอ่าน, การเขียน หรือทั้งการอ่านและเขียนได้
- Catchpoint manager หยุดการรันที่การเรียก throw, rethrow, catch ของ C++
- Printpoint manager สามารถพิมพ์ค่าตัวแปรที่จุดที่กำหนดได้เหมือน
dprintfของ GDB - GDB output บันทึกเอาต์พุตของโปรแกรม GDB เอง
- Seer output บันทึกเอาต์พุตสำหรับวินิจฉัยของโปรแกรม Seer
- ข้อมูล Stack frame:
- ดับเบิลคลิกรายการ frame เพื่อเปลี่ยน scope ของฟังก์ชันปัจจุบันได้
- แสดงอาร์กิวเมนต์ของฟังก์ชันในแต่ละ frame
- แสดงค่าตัวแปร local ของฟังก์ชันปัจจุบัน
- ข้อมูล Thread:
- แสดงรายการ ID ของ thread ทั้งหมด
- ดับเบิลคลิก thread ID เพื่อเปลี่ยน scope ของ thread ปัจจุบันได้
- แสดงรายการ stack frame ของแต่ละ thread
- รองรับโหมด Reverse Debugging ของ GDB
- สามารถเปิดหรือปิดการบันทึกคำสั่งได้
- สามารถตั้งทิศทางการ replay เป็น forward หรือ reverse ได้
คอนโซลและมุมมอง Assembly
- Seer Console แสดงเอาต์พุตข้อความทั้งหมดของไฟล์ executable
- การป้อนข้อความให้ไฟล์ executable ก็ทำได้จากคอนโซลเช่นกัน
- Assembly View เพิ่มแท็บที่แสดง assembly ที่กำลังรันอยู่ถัดจากแท็บซอร์สโค้ด
- เปิดใช้งานได้ที่
View->Assembly View - สามารถตั้ง breakpoint ในแท็บ assembly ได้ด้วย
- คำสั่งปัจจุบันจะถูกไฮไลต์
- เมื่อดับเบิลคลิกรายการในแท็บ Breakpoints หรือแท็บ Stack frames จะแสดง assembly ของที่อยู่นั้น
- รองรับคีย์ลัด
Nexti,Stepiโดยค่าเริ่มต้นมักเป็นCtrl+F5,CTRL+F6 - ใช้
^Fในแท็บ assembly เพื่อแสดงแถบค้นหาได้ - ฟีเจอร์ assembly นี้เป็นฟีเจอร์ใหม่ และเปิดรับข้อเสนอแนะด้านการเปลี่ยนแปลงหรือฟีเจอร์
- เปิดใช้งานได้ที่
เครื่องมือแสดงภาพ
-
Memory Visualizer
- ตรวจสอบเนื้อหา raw memory ได้
- ดูได้ในรูปแบบ memory และ disassembly
-
Array Visualizer
- แสดงภาพเนื้อหาของ array
- มีรูปแบบการแสดงผล Normal, Spline, Scatter
- สามารถใช้ array สองชุดเป็นกราฟ X-Y ได้
- array ตัวอย่าง
pointsประกอบเป็นรูปทรงเส้นขอบแบบ X-Y
-
Struct Visualizer
- แสดงเนื้อหาของ struct ใน C/C++ หรือ class ใน C++
- ตัวอย่างแสดงเนื้อหาของ
*thisใน class C++ ปัจจุบัน - สมาชิกของ struct ที่เป็น type พื้นฐานสามารถแก้ไขได้
- มี Basic Struct Visualizer ด้วย ซึ่งเบากว่าแต่ไม่สามารถตาม pointer ได้และแก้ไขไม่ได้
-
Image Visualizer
- ใช้เมื่อดูเนื้อหา raw memory ที่เป็นรูปภาพได้
การสนับสนุนและการติดต่อ
- ส่ง bug หรือคำขอฟีเจอร์ได้ที่
epasveer@att.netหรือเปิดเป็น GitHub issue - เปิด issue: GitHub issues
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ลองบิลด์และใช้งานกับ Godot บน Linux อยู่สักพัก โดยรวมก็โอเค แต่ UI ให้ความรู้สึกว่า ยัดวิดเจ็ตมากเกินไป และดูยังไม่ค่อยขัดเกลา
การเปลี่ยนฟอนต์ของเอดิเตอร์ไม่ทำงาน และเมื่อเอาเมาส์ไปวางบนตัวแปรเพื่อดูค่า ก็ไม่มีอะไรเกิดขึ้น หรือเคอร์เซอร์เปลี่ยนไปแวบเดียวก่อนที่ GDB จะขึ้นข้อผิดพลาดว่าพยายามใช้นิพจน์ที่มีชนิด/คีย์เวิร์ด
การดับเบิลคลิกตัวแปรจะเพิ่มค่าปัจจุบันและไทม์สแตมป์ลงในพาเนลบางอัน ดังนั้นตัว UI มีความสามารถในการอ่านค่า/นิพจน์อยู่ แต่ดูเหมือนส่วนทูลทิปจะพัง
ถ้าขัดเกลาอีกนิดก็น่าจะมีประโยชน์ แต่ในบรรดาฟรอนต์เอนด์ที่เคยใช้มา ตัวที่รู้สึกไม่ชอบน้อยที่สุดคือ Gede UI เรียบง่ายและเข้าใจง่าย แม้ฟีเจอร์จะไม่มาก แต่ฟีเจอร์ที่มีให้ใช้ก็มักทำงานได้ดีโดยไม่มีบั๊ก: https://gede.dexar.se/
ถ้าต้องการบันทึกการตั้งค่าแบบถาวร ต้องใช้ “Save Configuration...” ส่วนการ แสดงค่าตอนเอาเมาส์ไปวาง บนตัวแปรผมจะลองทดสอบดูเช่นกัน และถ้ามีบั๊กหรือคำขอฟีเจอร์ก็ช่วยเปิดเป็น GitHub issue ไว้ได้เลย
GDB มี ส่วนติดต่อผู้ใช้แบบข้อความ (TUI) ในตัวที่ใช้ง่ายกว่าที่คิดด้วย รองรับการโต้ตอบด้วยเมาส์ด้วย: https://sourceware.org/gdb/current/onlinedocs/gdb.html/TUI.h...
.gdbinitก็ได้tui new-layout default regs 1 {-horizontal src 1 asm 1} 2 status 0 cmd 1tui layout defaulttui enableหลังจากลองใช้ฟรอนต์เอนด์ของ GDB หลายตัวแล้ว ผมมองว่า TUI ดีที่สุด ถ้าโปรแกรมพิมพ์เอาต์พุตจนอินเทอร์เฟซเละ แค่รู้จัก
Ctrl + Lเพื่อวาดหน้าจอใหม่ก็พอใน
$XDG_CONFIG_HOME/gdb/gdbinitผมใส่ไว้แค่นี้layout srcset confirm offset prompt \001\033[01;36m\002(gdb)\001\033[0m\002ส่วนฮิสทอรีบันทึกแบบนี้
set history save onset history size 500000set history filename ~/.cache/gdb/historygdb-dashboardเยอะและขอแนะนำ คล้ายกับ TUI แต่เลือกข้อมูลที่จะแสดงได้หลากหลาย และ สีช่วยให้อ่านเอาต์พุตง่ายขึ้นมากยังสามารถแสดงแดชบอร์ดในเทอร์มินัลอื่น หรือแบ่งไปหลายเทอร์มินัลได้ ทำให้จัดเลย์เอาต์หน้าต่างได้ดีกว่า เมื่อก่อนเคยเขียนสคริปต์ให้ tmux สร้างเลย์เอาต์เทอร์มินัลอัตโนมัติแล้วเชื่อมเข้ากับ GDB แม้จะเหนื่อยอยู่พอควร แต่ก็ได้เลย์เอาต์ที่ค่อนข้างดี
Ctrl + Lเป็นสิ่งที่ต้องรู้ในสาย TUI รวมถึงเวลาหน้าจอ Vim เละด้วย พอรู้เรื่องนี้แล้ว “แครช” ปริศนาจำนวนมากก็ถูกแก้ได้แม้จะเชื่อมต่อจาก Windows ไปยัง Linux หรือใช้ WSL ก็สามารถรีโมตดีบักโปรเซส Linux ด้วย WinDBG/VisualStudio ได้
นี่คือ Qt UI สำหรับ GDB
เท่าที่ผมรู้ยังมี gdbgui ซึ่งเป็น UI บนเว็บสำหรับ GDB ด้วย: https://www.gdbgui.com/
เป็นเรื่องดีเสมอที่มีความเคลื่อนไหวในฝั่งเครื่องมือดีบักมากขึ้น
ยังขาดฟีเจอร์อยู่พอสมควร ซึ่งบางกรณีการใช้งานอาจจำเป็น เพราะวิธีใช้งานของผมเน้น การดีบักระดับแอสเซมบลี เป็นหลัก เลยไม่ได้ต้องการฟีเจอร์หวือหวาอะไรมากนัก
เมื่อ 2 ปีก่อนก็มีการถกเถียงขนาดกลางอยู่เหมือนกัน: https://news.ycombinator.com/item?id=33044885
ถ้าเป็นผู้ใช้ Emacs แล้ว GUD ถือเป็นการผสานรวม GDB ที่ยอดเยี่ยมทีเดียว
ไม่มีเหตุผลต้องคอยลองเอดิเตอร์ใหม่ประจำเดือนเพียงเพราะมันเพิ่มฟีเจอร์เหมือนของเล่นบางอย่าง ใส่ปลั๊กอินสักตัวใน Emacs ก็ได้ฟีเจอร์เดียวกัน โดยที่ส่วนอื่น ๆ ยังเป็นแบบที่ผมชอบเหมือนเดิม
ผมเริ่มอินกับการเขียนโค้ดจริงจังในยุคที่ยังมี Atom และค่อนข้างเสียดายที่ Atom หายไปแล้วกลายเป็น VS Code เพราะ VS Code ก็ดี แต่ไม่ได้เดินตามปรัชญาเดียวกับ Atom
ตั้งแต่เรียน Emacs เมื่อราว 4 ปีก่อน ก็ไม่มีเครื่องมือใหม่ตัวไหนเคยโน้มน้าวผมได้ว่า “นี่เป็นเทคโนโลยีเก่าแล้ว ควรย้ายไปใช้อย่างอื่น” เป็นการพร่ำยาวแบบหลุดประเด็นหน่อย แต่ผมขอบคุณจริง ๆ ที่ Emacs ยังอยู่รอดต่อมาได้
M-x gdbซึ่งเป็น GDB Graphical Interface ของ Emacs มากกว่าการผสานรวมพื้นฐานผ่าน GUD อย่างM-x gud-gdbช่วงหลังต้องเปลี่ยนไปใช้ GUD เพื่อรัน lldb แล้วคิดถึงหน้าต่างเฉพาะที่แสดง breakpoint, thread, stack ปัจจุบัน ฯลฯ
ข้อดีของ GUD คืออินเทอร์เฟซสม่ำเสมอแม้ตัวดีบักเกอร์จะต่างกัน ดังนั้นต่อให้ดีบัก Python ด้วย pdb แล้วไปดีบัก C++ ด้วย lldb ก็ไม่ต้องเรียนคีย์ลัดใหม่
https://www.gnu.org/software/emacs/manual/html_node/emacs/GD...
https://www.gnu.org/software/emacs/manual/html_node/emacs/St...
พอใช้ร่วมกับ debugpy แล้วก็เลิกใช้
M-x pdbไปเลย และ UI ก็คล้ายกับM-x gdbมากlsp-mode+dap-modeก็ทำงานได้ดีเหมือนกัน แต่ต้องไปปรับไฟล์launch.jsonเองพอสมควรดีเลย เห็นครั้งแรกแล้วนึกถึง DDD ที่ดูเหมือนเวทมนตร์ น่าแปลกใจที่ DDD ยังมีการดูแลอยู่
https://en.wikipedia.org/wiki/Data_Display_Debugger
https://www.gnu.org/software/ddd/
จากบทสนทนาตลอดหลายปี DDD นั้นย้อนแย้งตรงที่เป็นเครื่องมือต่อต้านการตลาดที่ยอดเยี่ยม และเหมือนผลักนักพัฒนาไปหา UI ดีบักเกอร์ในตัวของ IDE ที่ตัวเองชอบแทน ตัว DDD เองทรงพลังมากก็จริง แต่คำว่า “ประโยชน์ใช้สอยสำคัญกว่าสุนทรียะ” ก็มีขีดจำกัดเหมือนกัน
หลังจากเขียนบทความ ผู้ดูแลก็แก้ปัญหาที่ผมชี้ไว้ ทำให้ตอนนี้ไม่ต้องใช้วิธีอ้อม ๆ หลายอย่างแล้ว 3.4.0 และ 3.4.1 เป็นรีลีสที่ค่อนข้างใหญ่
เมื่อก่อนเคยมีโปรเจกต์พยายามพอร์ตไป GTK3 แต่ดูเหมือนจะหายไปแล้ว อย่างไรก็ดี ดีใจที่โปรเจกต์ mainline ยังเดินหน้าต่อ
แต่ก็ดูเหมือนมีคนย้ายไป GitHub เพื่อชุบชีวิตและทำงานต่อเล็กน้อย: https://github.com/antony-jr/insight
ผมเจอ DDD ตอนกำลังหาอะไรที่คล้ายกับ dbxtool ที่เคยใช้บนเครื่อง Sun Microsystems รุ่นเก่า ๆ คนสมัยนี้ค่อนข้างได้เสวยสุขจากของอย่างการดีบักระดับซอร์สโค้ด
ดูเหมือนโปรเจกต์ GNU และ RMS จะถูกล้อเลียนเป็นมีมบ่อย ๆ แต่ GDB เป็นเครื่องมือที่ทรงพลัง ผมเคยลองจับเองแค่นิดหน่อย แต่ดูเหมือนมันส่งผลมหาศาลต่องานของนักพัฒนามาหลายปี
กว่า 10 ปีก่อน ตอนเขียน C++ บน Linux ผมใช้ Qt Creator ที่มีดีบักเกอร์ในตัว มันเป็นฟรอนต์เอนด์ GDB ที่ทำงานได้ดีมาก และสำหรับ C++ กับ Qt ผมไม่เห็นเหตุผลต้องใช้อย่างอื่นเลย