Seer: Front-end GUI cho GDB trên Linux
(github.com/epasveer)- Seer là một front-end để điều khiển GDB bằng GUI trên Linux, đang được phát triển tích cực với mục tiêu trở thành GUI đơn giản nhưng đẹp mắt cho GDB
- Có thể cài đặt bằng trình quản lý gói hoặc tự build từ mã nguồn; yêu cầu gồm Linux, C++17, GDB hỗ trợ trình thông dịch MI, CMake 3.5.0 trở lên, Qt6
- Qt5 không còn biên dịch được với cây mã nguồn mới nhất; cây mã nguồn 2.3 là cây cuối cùng có thể biên dịch với Qt5 và v1.17 là bản phát hành Qt5 cuối cùng
- Seer cung cấp trong GUI khả năng duyệt mã nguồn, hiển thị biến/thanh ghi, quản lý breakpoint/watchpoint/catchpoint/printpoint, xem stack/thread và GDB reverse debugging
- Các tính năng bổ sung gồm xem assembly, trực quan hóa bộ nhớ/mảng/cấu trúc/ảnh, và console vào/ra của chương trình đang chạy, giúp thao tác công việc debug GDB theo cách trực quan
Tổng quan dự án
- Seer là front-end GUI cho GDB trên Linux
- Mục tiêu là cung cấp một GUI đơn giản nhưng đẹp mắt cho GDB
- Dự án đang được phát triển tích cực; có thể gửi bug hoặc tính năng mong muốn qua email hoặc GitHub issue
Cài đặt và yêu cầu
- Seer có thể được cài bằng trình quản lý gói hoặc build từ mã nguồn
- Yêu cầu:
- Linux
- C++17
- GDB hỗ trợ trình thông dịch
mi- Lệnh kiểm tra:
gdb --interpreter=mi
- Lệnh kiểm tra:
- CMake 3.5.0 trở lên
- Qt6
- Khi build từ mã nguồn, cần các gói phát triển Qt6 phù hợp với bản phân phối
- Các module Qt6 cần thiết là Core, Gui, Widgets, PrintSupport, Charts, Svg
- Hướng dẫn build Qt6: Building Seer - Qt6
- Giới hạn liên quan đến Qt5:
-
Seer không còn biên dịch được với Qt5
- Cây mã nguồn 2.3 là cây cuối cùng có thể biên dịch với Qt5
- Hướng dẫn build Qt5: Building Seer - Qt5
-
Các cách cài đặt gói
- Pamac trên Manjaro:
pamac install seer
- zypper trên openSUSE Tumbleweed:
zypper install seergdb
- Flathub:
- io.github.epasveer.seer
flatpak install flathub io.github.epasveer.seer
- Bản beta Flatpak:
- Seer release page
- Tải về và cài
seer.flatpak - Để chạy GDB từ
GDB Launcher, cầnflatpak-spawn --host
Bản phát hành và chuyển sang Qt
- Có thể xem tin mới tại Seer Wiki
- v1.17 là bản phát hành Qt5 cuối cùng
- Bản phát hành tiếp theo là v2.0 và dựa trên Qt6
- Trong một thời gian, vẫn có thể biên dịch với Qt5, nhưng nếu cần mã nguồn Qt5 ổn định mới nhất thì phải dùng v1.17
Cách chạy
- Seer được tạo ra để dễ dàng khởi chạy chương trình cần debug từ dòng lệnh
- Vì GDB hỗ trợ debug chương trình theo nhiều cách, Seer cũng cung cấp nhiều phương thức chạy
- Có thể xem cách chạy tại wiki Starting Seer
Cấu trúc GUI chính
-
Source/Function/Types/Variables/Libraries
- Hiển thị danh sách các tệp mã nguồn và header được dùng trong chương trình
- Có thể tìm kiếm hàm, kiểu dữ liệu và biến tĩnh
- Nhấp đúp để mở tệp mã nguồn
- Hiển thị danh sách shared library mà chương trình tham chiếu
- Danh sách tệp mã nguồn/header có thể được lọc bằng tìm kiếm để giảm số mục hiển thị
-
Variable/Register Info
- Hiển thị giá trị của biến và thanh ghi
- Logger ghi lại giá trị biến
- Tracker hiển thị giá trị của các biến được chỉ định mỗi khi GDB tới một điểm dừng như step, next, finish
- Registers hiển thị giá trị của toàn bộ thanh ghi CPU
-
Code Manager
- Là vùng lớn ở giữa GUI Seer, hiển thị các tệp mã nguồn theo tab
- Có thể tìm kiếm văn bản trong tệp bằng
^F - Có thể nhấp đúp vào tên biến để thêm vào Logger
CTRL+ nhấp đúp sẽ thêm*trước biếnSHIFT+ nhấp đúp sẽ thêm&trước biếnCTRL+SHIFT+ nhấp đúp sẽ thêm*&trước biến
- Menu chuột phải cho phép thêm biến vào Tracker hoặc Memory Visualizer
- Có thể tạo breakpoint hoặc printpoint tại một dòng cụ thể
- Có thể chạy tới một dòng cụ thể
- Có thể tách tab bằng cách nhấp đúp
Điều khiển debug và xem trạng thái thực thi
- Khu vực phía dưới xử lý breakpoint, watchpoint, catchpoint, printpoint, lệnh GDB thủ công và log
- Trong tab lệnh thủ công, có thể nhập trực tiếp lệnh GDB hoặc GDB/MI
- Các lệnh đã nhập sẽ được ghi nhớ cho lần dùng Seer sau
- Breakpoint manager dùng để tạo và quản lý breakpoint
- Watchpoint manager theo dõi truy cập biến
- Có thể theo dõi đọc, ghi hoặc đọc/ghi
- Catchpoint manager dừng thực thi tại các lời gọi throw, rethrow, catch của C++
- Printpoint manager có thể in biến tại điểm cụ thể như
dprintfcủa GDB - GDB output ghi lại đầu ra của chính chương trình GDB
- Seer output ghi lại đầu ra chẩn đoán của chương trình Seer
- Thông tin stack frame:
- Có thể nhấp đúp danh sách frame để đổi scope hàm hiện tại
- Hiển thị đối số hàm của từng frame
- Hiển thị giá trị biến cục bộ của hàm hiện tại
- Thông tin thread:
- Hiển thị danh sách ID của tất cả thread
- Có thể nhấp đúp ID thread để đổi scope thread hiện tại
- Liệt kê stack frame của từng thread
- Hỗ trợ chế độ Reverse Debugging của GDB
- Có thể bật hoặc tắt ghi lịch sử lệnh
- Có thể đặt hướng phát lại là forward hoặc reverse
Console và xem assembly
- Seer Console hiển thị toàn bộ đầu ra văn bản của file thực thi
- Có thể nhập dữ liệu văn bản cho file thực thi ngay trong console
- Assembly View thêm một tab bên cạnh các tab mã nguồn để hiển thị assembly đang thực thi
- Kích hoạt tại
View->Assembly View - Cũng có thể đặt breakpoint trong tab assembly
- Lệnh hiện tại được tô nổi bật
- Nhấp đúp mục trong tab Breakpoints hoặc Stack frames sẽ hiển thị assembly tại địa chỉ đó
- Hỗ trợ phím tắt
Nexti,Stepi, mặc định thường làCtrl+F5,CTRL+F6 - Dùng
^Ftrong tab assembly để hiện thanh tìm kiếm - Tính năng assembly này là tính năng mới và có thể thay đổi; tác giả hoan nghênh đề xuất tính năng
- Kích hoạt tại
Công cụ trực quan hóa
-
Memory Visualizer
- Có thể xem nội dung bộ nhớ thô
- Có thể xem dưới dạng bộ nhớ và disassembly
-
Array Visualizer
- Trực quan hóa nội dung mảng
- Cung cấp các kiểu hiển thị Normal, Spline, Scatter
- Có thể dùng hai mảng làm biểu đồ X-Y
- Mảng ví dụ
pointstạo thành một đường viền X-Y
-
Struct Visualizer
- Hiển thị nội dung của struct C/C++ hoặc class C++
- Ví dụ hiển thị nội dung
*thiscủa class C++ hiện tại - Có thể chỉnh sửa các thành viên struct có kiểu cơ bản
- Cũng có Basic Struct Visualizer, nhẹ hơn nhưng không thể lần theo con trỏ và cũng không thể chỉnh sửa
-
Image Visualizer
- Có thể dùng khi xem nội dung bộ nhớ thô là ảnh
Hỗ trợ và liên hệ
- Có thể gửi bug hoặc yêu cầu tính năng tới
epasveer@att.nethoặc đăng GitHub issue - Đăng issue: GitHub issues
1 bình luận
Các ý kiến trên Hacker News
Tôi đã build và dùng thử một chút cùng Godot trên Linux; nhìn chung ổn, nhưng UI có cảm giác nhồi nhét quá nhiều widget và trông hơi thiếu trau chuốt
Việc đổi phông chữ trình soạn thảo không hoạt động; khi rê chuột lên biến để xem giá trị thì hoặc không có gì xảy ra, hoặc con trỏ chỉ đổi rất nhanh rồi GDB báo lỗi rằng nó đã cố dùng một biểu thức có kiểu/từ khóa
Nhấp đúp vào biến sẽ thêm giá trị hiện tại và timestamp vào một panel nào đó, nên bản thân chức năng đọc giá trị/biểu thức trong UI là có, nhưng có vẻ phần tooltip bị hỏng
Chỉ cần trau chuốt thêm một chút thì có thể hữu ích, nhưng trong các frontend tôi từng thử đến nay, cái tôi ít khó chịu nhất là Gede. UI đơn giản, trực quan; dù không nhiều tính năng, các tính năng được đưa ra dùng nhìn chung hoạt động tốt, không lỗi: https://gede.dexar.se/
Để lưu cấu hình vĩnh viễn, cần dùng “Save Configuration...”. Tôi cũng sẽ thử phần hiển thị giá trị khi rê chuột, và nếu có bug hay yêu cầu tính năng thì mong bạn để lại GitHub issue
GDB thực ra cũng có giao diện người dùng dạng văn bản (TUI) tích hợp khá dễ dùng một cách bất ngờ. Nó còn hỗ trợ cả tương tác bằng chuột: https://sourceware.org/gdb/current/onlinedocs/gdb.html/TUI.h...
.gdbinittui new-layout default regs 1 {-horizontal src 1 asm 1} 2 status 0 cmd 1tui layout defaulttui enableSau khi dùng thử nhiều frontend cho GDB, tôi thấy TUI là tốt nhất. Khi chương trình in output làm hỏng giao diện, chỉ cần biết
Ctrl + Lđể vẽ lại là đượcTrong
$XDG_CONFIG_HOME/gdb/gdbinittôi chỉ đặt phần dưới đâylayout srcset confirm offset prompt \001\033[01;36m\002(gdb)\001\033[0m\002Lưu history như thế này
set history save onset history size 500000set history filename ~/.cache/gdb/historygdb-dashboardkhá nhiều và khuyên dùng. Nó tương tự TUI nhưng có thể chọn nhiều loại thông tin để hiển thị, và nhờ màu sắc nên output dễ đọc hơn nhiềuCũng có thể hiển thị dashboard ở terminal khác hoặc chia ra nhiều terminal, nên có thể tạo bố cục cửa sổ tốt hơn. Trước đây tôi từng viết script dùng tmux để tự động tạo bố cục terminal và kết nối vào GDB; khá tốn công, nhưng tạo được layout khá ổn
Ctrl + Llà thứ bắt buộc phải biết với các giao diện kiểu TUI, kể cả khi màn hình Vim bị hỏng. Sau khi biết điều này, rất nhiều “crash” bí ẩn đã được giải quyếtNgay cả khi kết nối từ Windows sang Linux hoặc dùng WSL, cũng có thể debug từ xa tiến trình Linux bằng WinDBG/VisualStudio
Đây là Qt UI cho GDB
Theo tôi biết thì còn có gdbgui, một UI nền web cho GDB: https://www.gdbgui.com/
Luôn tốt khi có thêm nhiều chuyển động trong mảng công cụ debug
Nó vẫn còn thiếu khá nhiều tính năng có thể là bắt buộc với một số mục đích sử dụng. Vì cách tôi dùng chủ yếu là debug ở mức assembly, nên tôi không cần nhiều tính năng hào nhoáng
2 năm trước cũng từng có một cuộc thảo luận cỡ vừa: https://news.ycombinator.com/item?id=33044885
Nếu bạn là người dùng Emacs thì GUD là một tích hợp GDB khá tuyệt vời
Không có lý do gì để cứ thử trình soạn thảo mới của tháng này chỉ vì nó thêm vài tính năng kiểu đồ chơi. Chỉ cần cài thêm một plugin cho Emacs là có cùng tính năng, còn mọi thứ khác vẫn giữ đúng cách tôi thích
Tôi thật sự bắt đầu mê lập trình vào thời Atom còn tồn tại, và khá tiếc khi Atom biến mất rồi trở thành VS Code. Vì VS Code tốt, nhưng không đi theo cùng triết lý như Atom
Từ khi học Emacs khoảng 4 năm trước, chưa có công cụ mới nào thuyết phục được tôi rằng “đây là công nghệ cũ rồi, phải chuyển thôi”. Hơi lan man bất chợt, nhưng tôi thật sự biết ơn vì Emacs vẫn tiếp tục tồn tại
M-x gdb, tức GDB Graphical Interface của Emacs, hơn tích hợp mặc định qua GUD làM-x gud-gdbGần đây tôi phải chuyển sang GUD để chạy lldb, và tôi đã nhớ các cửa sổ chuyên dụng hiển thị breakpoint, thread, stack hiện tại, v.v.
Điểm hay của GUD là giao diện nhất quán dù dùng debugger nào. Vì vậy khi chuyển từ debug Python bằng pdb sang debug C++ bằng lldb, bạn không cần học lại phím tắt
https://www.gnu.org/software/emacs/manual/html_node/emacs/GD...
https://www.gnu.org/software/emacs/manual/html_node/emacs/St...
Dùng cùng debugpy thì tôi không còn dùng
M-x pdbnữa, và UI cũng rất giốngM-x gdblsp-mode+dap-modecũng hoạt động tốt, nhưng bạn phải tự chỉnh filelaunch.jsonở mức nào đóHay đấy. Nó làm tôi nhớ đến DDD, thứ lần đầu nhìn thấy đã như ma thuật. Thật ngạc nhiên là DDD vẫn còn được bảo trì
https://en.wikipedia.org/wiki/Data_Display_Debugger
https://www.gnu.org/software/ddd/
Qua nhiều năm trò chuyện, DDD nghịch lý thay lại là một công cụ phản tiếp thị xuất sắc, đẩy các lập trình viên vào UI debugger tích hợp của IDE họ thích. Bản thân DDD đúng là rất mạnh, nhưng “tính hữu dụng quan trọng hơn thẩm mỹ” cũng có giới hạn
Sau khi tôi viết bài, các maintainer đã sửa những vấn đề tôi chỉ ra, nên giờ không còn cần nhiều cách обход обход nào nữa. 3.4.0 và 3.4.1 là các bản phát hành khá lớn
Trước đây từng có một dự án port sang GTK3 nhưng có vẻ đã biến mất. Dù vậy, thật mừng là dự án mainline vẫn tiếp tục
Dù vậy, có vẻ ai đó đã chuyển nó lên GitHub, hồi sinh và làm thêm một chút: https://github.com/antony-jr/insight
Khi tìm thứ gì đó tương tự dbxtool mà tôi từng dùng trên máy Sun Microsystems ngày xưa, tôi đã tìm ra DDD. Người thời nay khá là sung sướng nhờ những thứ như debug ở mức source
Dự án GNU và RMS có vẻ bị chế giễu như meme khá nhiều, nhưng GDB là một công cụ mạnh mẽ. Tôi chỉ mới tự tay dùng một chút, nhưng nó có vẻ đã ảnh hưởng cực lớn đến công việc của các lập trình viên suốt nhiều năm
Hơn 10 năm trước, khi viết C++ trên Linux, tôi dùng Qt Creator có debugger tích hợp. Nó là frontend GDB, hoạt động rất tốt, và với C++ cùng Qt thì tôi không thấy có lý do gì để dùng thứ khác