3 điểm bởi GN⁺ 2024-11-16 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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
    • 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:
  • Bản beta Flatpak:
    • Seer release page
    • Tải về và cài seer.flatpak
    • Để chạy GDB từ GDB Launcher, cần flatpak-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ến
      • SHIFT + nhấp đúp sẽ thêm & trước biến
      • CTRL+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ư dprintf củ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 ^F trong 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

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ụ points tạ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 *this củ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.net hoặc đăng GitHub issue
  • Đăng issue: GitHub issues

1 bình luận

 
GN⁺ 2024-11-16
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/

    • Tôi là tác giả Seergdb. Mong bạn nói rõ hơn phần thiết lập phông chữ trình soạn thảo không hoạt động; trong các bài test thì có vẻ nó chạy được
      Để 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
    • Tôi không muốn trong lúc tìm bug trong code của mình lại phải đối phó thêm với bug của công cụ debug, nên tôi ghi chú lại để lần sau cần debug sẽ thử Gede
  • 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...

    • Cá nhân tôi thích dòng lệnh hơn TUI, nhưng có thể đưa kiểu này vào .gdbinit
      tui new-layout default regs 1 {-horizontal src 1 asm 1} 2 status 0 cmd 1
      tui layout default
      tui enable
    • Tổ hợp Neovim + nvim-dap + nvim-dap-ui + gdb tốt hơn thế nhiều
    • Tiếc là nó chỉ hoạt động khi GDB được build kèm hỗ trợ TUI
  • Sau 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à được
    Trong $XDG_CONFIG_HOME/gdb/gdbinit tôi chỉ đặt phần dưới đây
    layout src
    set confirm off

    • Tôi thích dùng prompt có màu như thế này
      set prompt \001\033[01;36m\002(gdb)\001\033[0m\002
      Lưu history như thế này
      set history save on
      set history size 500000
      set history filename ~/.cache/gdb/history
    • Tôi đã dùng gdb-dashboard khá 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ều
      Cũ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 + L là 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ết
    • gef hỗ trợ tmux nên output của chương trình sẽ đi sang panel tmux khác
    • Frontend gud-gdb trong Emacs khá tiện và dễ dùng
  • Ngay 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

    • Chẳng phải chỉ cần phía remote đang chạy gdbserver là được sao?
  • Đâ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

    • Tôi thích việc GDB hoạt động trong Qt Creator mà không cần cấu hình phức tạp. Chỉ cần đặt vài breakpoint rồi bấm chạy, IDE sẽ xử lý phần còn lại
    • Nếu bổ sung thêm một mục vào danh sách GDB GUI thì cũng có cái tôi làm: https://github.com/dzaima/grr
      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
    • Cũng có DDD. Đó là một frontend Motif
    • VS Code cũng có frontend GDB khá ổn, đặc biệt tốt khi debug vi điều khiển nhúng
    • Nhân tiện nói về debugger nền web, gần đây tôi đã làm một dự án tương tự, tập trung vào debug assembly x86-64: https://github.com/robalb/x86-64-playground
  • 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

    • Từ khi LSP xuất hiện, Emacs khiến tôi cảm thấy tốt hơn mọi thứ khác. Không có lý do gì để rời đi. Đặc biệt là sau khi nó nhanh hơn nhờ biên dịch native
      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
    • Tôi thích 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-gdb
      Gầ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...
    • dape(https://github.com/svaante/dape#) là một lựa chọn tốt cho các ngôn ngữ có debugger triển khai Debug Adapter Protocol
      Dùng cùng debugpy thì tôi không còn dùng M-x pdb nữa, và UI cũng rất giống M-x gdb
    • lsp-mode + dap-mode cũng hoạt động tốt, nhưng bạn phải tự chỉnh file launch.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/

    • 20 năm trước tôi học DDD ở đại học, và lúc đó nó đã cảm giác khá thô kệch rồi. Giờ tôi nhìn nó bao dung hơn nhiều, nhưng Motif vẫn chướng mắt
      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
    • Tất nhiên DDD vẫn đang được bảo trì. Tôi đã viết về các tính năng ở đây: https://begriffs.com/posts/2022-07-17-debugging-gdb-ddd.html
      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
    • Tôi thích việc DDD tích hợp nhiều dạng trực quan hóa đồ họa. Đặc biệt tôi luôn nghĩ tính năng trực quan hóa cấu trúc dữ liệu rất hay
      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
    • Nó làm tôi nhớ đến Insight, frontend GDB tôi thích nhất, từng hoạt động tốt trên Windows thời cygwin. Đáng tiếc là rõ ràng nó không còn được bảo trì nữa: https://sourceware.org/insight/screenshots.php
      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
    • DDD rất tuyệt. Tôi vẫn dùng, nhưng tôi là kiểu người hóa thạch
      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

    • Tôi thật sự tò mò, GNU bị chế giễu vì điều gì vậy?
  • 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