3 ポイント 投稿者 GN⁺ 2024-11-16 | 1件のコメント | WhatsAppで共有
  • SeerはLinuxでGDBをGUIで操作するためのフロントエンドで、シンプルで見栄えのよいGDB用GUIを目指して活発に開発中
  • インストールはパッケージマネージャーまたはソースビルドで可能で、要件はLinux、C++17、MIインタプリタ対応GDB、CMake 3.5.0以上、Qt6
  • Qt5は最新のソースツリーではもうコンパイルできず、2.3ソースツリーがQt5でコンパイル可能な最後のツリーで、v1.17が最後のQt5リリース
  • Seerはソース探索、変数・レジスタ表示、ブレークポイント・ウォッチポイント・キャッチポイント・プリントポイント管理、スタック・スレッド表示、GDB reverse debuggingをGUIで提供
  • 追加機能としてアセンブリ表示、メモリ・配列・構造体・画像の可視化、実行プログラムの入出力コンソールを備え、GDBデバッグ作業を視覚的に扱える

プロジェクト概要

  • SeerはLinux向けGDB GUIフロントエンド
  • 目標はGDBに対してシンプルで見栄えのよいGUIを提供すること
  • プロジェクトは活発に開発中で、バグや要望機能はメールまたはGitHub issueで送ることができる

インストールと要件

  • Seerはパッケージマネージャーまたはソースビルドでインストールできる
  • 要件:
    • Linux
    • C++17
    • miインタプリタをサポートするGDB
      • 確認コマンド: 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

パッケージインストール方法

  • ManjaroのPamac:
    • pamac install seer
  • openSUSE Tumbleweedのzypper:
    • zypper install seergdb
  • Flathub:
  • Flatpakベータ版:
    • Seer release page
    • seer.flatpakをダウンロードしてインストール
    • GDB LauncherでGDBを実行するには flatpak-spawn --host が必要

リリースとQt移行

  • Seer Wikiで最新情報を確認できる
  • v1.17は最後のQt5リリース
  • 次のリリースはv2.0で、Qt6ベース
  • 当面はQt5でもコンパイル可能だが、最新の安定Qt5ソースが必要なら v1.17 を使う必要がある

起動方法

  • Seerはコマンドラインからデバッグ対象プログラムを簡単に起動できるように作られている
  • GDBはプログラムデバッグを複数の方法でサポートしているため、Seerも複数の起動方法を提供する
  • 起動方法は Starting Seer ウィキで確認できる

メインGUI構成

  • Source/Function/Types/Variables/Libraries

    • プログラムで使われたソース・ヘッダファイルの一覧を表示
    • 関数、型、静的変数を検索できる
    • ダブルクリックでソースファイルを開ける
    • プログラムが参照する共有ライブラリの一覧を表示
    • ソース・ヘッダファイル一覧は検索で表示項目を絞り込める
  • Variable/Register Info

    • 変数とレジスタの値を表示
    • Loggerは変数値を記録する
    • TrackerはGDBが step、next、finish などの停止地点に到達するたびに指定した変数の値を表示する
    • RegistersはすべてのCPUレジスタ値を表示する
  • Code Manager

    • Seer GUI中央の大きな領域で、ソースファイルをタブ表示する
    • ^Fでファイル内テキスト検索が可能
    • 変数名をダブルクリックしてLoggerに追加できる
      • CTRL ダブルクリックは変数の前に * を付ける
      • SHIFT ダブルクリックは変数の前に & を付ける
      • CTRL+SHIFT ダブルクリックは変数の前に *& を付ける
    • 右クリックメニューで変数をTrackerまたはMemory Visualizerに追加できる
    • 特定の行でブレークポイントやプリントポイントを作成できる
    • 特定の行まで実行できる
    • タブはダブルクリックで分離できる

デバッグ制御と実行状態表示

  • 下部領域はブレークポイント、ウォッチポイント、キャッチポイント、プリントポイント、手動GDBコマンド、ログを扱う
  • 手動コマンドタブではGDBまたはGDB/MIコマンドを直接入力できる
    • 入力したコマンドは次回のSeer使用のために記憶される
  • Breakpoint managerはブレークポイントを作成・管理する
  • Watchpoint managerは変数アクセスを監視する
    • 読み取り、書き込み、読み取り・書き込みを監視できる
  • Catchpoint managerはC++の throw、rethrow、catch 呼び出しで実行を停止する
  • Printpoint managerはGDBの dprintf のように特定地点で変数を出力できる
  • GDB outputはGDBプログラム自体の出力を記録する
  • Seer outputはSeerプログラムの診断用出力を記録する
  • Stack frame情報:
    • フレーム一覧をダブルクリックして現在の関数スコープを切り替えられる
    • 各フレームの関数引数を表示する
    • 現在の関数のローカル変数値を表示する
  • Thread情報:
    • すべてのスレッドID一覧を表示する
    • スレッドIDをダブルクリックして現在のスレッドスコープを切り替えられる
    • 各スレッドのスタックフレームを一覧表示する
  • GDBのReverse Debuggingモードをサポート
    • コマンド記録のオン・オフを切り替えられる
    • 再生方向を forward または reverse に設定できる

コンソールとアセンブリ表示

  • Seer Consoleは実行ファイルのすべてのテキスト出力を表示する
  • 実行ファイルへのテキスト入力もコンソールから行える
  • Assembly Viewはソースコードタブの横に、現在実行中のアセンブリを表示するタブを追加する
    • View->Assembly View で有効化する
    • アセンブリタブでもブレークポイントを設定できる
    • 現在の命令が強調表示される
    • BreakpointsタブまたはStack framesタブの項目をダブルクリックすると、そのアドレスのアセンブリを表示する
    • Nexti, Stepi ショートカットをサポートし、デフォルトは通常 Ctrl+F5, CTRL+F6
    • アセンブリタブで ^F を使うと検索バーを表示する
    • このアセンブリ機能は新機能であり、変更案・機能提案を受け付けている

可視化ツール

  • Memory Visualizer

    • 生メモリの内容を確認できる
    • メモリ表示と逆アセンブル表示で見られる
  • Array Visualizer

    • 配列の内容を可視化する
    • Normal, Spline, Scatter の表示方式を提供する
    • 2つの配列をX-Yプロットとして使える
    • 例の points 配列はX-Y輪郭形状を構成する
  • Struct Visualizer

    • C/C++構造体またはC++クラスの内容を表示する
    • 例では現在のC++クラスの *this 内容を表示する
    • 基本型の構造体メンバーは編集できる
    • Basic Struct Visualizer もあり、より軽量だがポインタをたどれず編集もできない
  • Image Visualizer

    • 画像である生メモリ内容を見るときに使える

サポートと問い合わせ

  • バグや機能要望は epasveer@att.net に送るか、GitHub issueに登録できる
  • issue登録: GitHub issues

1件のコメント

 
GN⁺ 2024-11-16
Hacker News のコメント
  • Linux で Godot と一緒にビルドして少し使ってみたが、全体的には悪くないものの、UI はウィジェットを詰め込みすぎた感じで、やや磨き込み不足に見える
    エディタのフォント変更は動作せず、変数にマウスを載せて値を見ようとしても何も起きないか、ごく短くカーソルが変わるだけで、GDB が型/キーワードを含む式を使おうとしたというエラーを出す
    変数をダブルクリックすると現在値とタイムスタンプがどこかのパネルに追加されるので、UI 上で値/式を読む機能自体はあるが、ツールチップ側の実装が壊れているようだ
    もう少し磨けば便利になりそうだが、これまで試したフロントエンドの中で一番嫌ではなかったのは Gede だった。UI はシンプルで直感的で、機能は多くなくても表に出ている機能はバグなくよく動くほうだ: https://gede.dexar.se/

    • Seergdb の作者です。エディタのフォント設定が効かないという点をもう少し説明してもらえると助かります。テストでは動作しているように見えます
      設定を永続保存するには “Save Configuration...” を実行する必要があります。変数値のマウスオーバー表示もテストしてみます。バグや機能要望は GitHub Issue に残してもらえると助かります
    • 自分のコードのバグを探している最中に、デバッグツールのバグまで相手にしたくはないので、次にデバッグが必要になったら Gede を試すためにメモしておく
  • GDB には意外と使いやすい組み込みの**テキストユーザーインターフェイス(TUI)**もある。マウス操作にも対応している: https://sourceware.org/gdb/current/onlinedocs/gdb.html/TUI.h...

    • 個人的には TUI よりコマンドラインのほうが好みだが、.gdbinit にこんな感じで入れておけばよい
      tui new-layout default regs 1 {-horizontal src 1 asm 1} 2 status 0 cmd 1
      tui layout default
      tui enable
    • Neovim + nvim-dap + nvim-dap-ui + gdb の組み合わせのほうがずっと良かった
    • 残念ながら、GDB が TUI サポート付きでビルドされている場合にしか動作しない
  • いくつかの GDB フロントエンドを使ってみてからは、TUI が一番ましだと思っている。プログラムが出力してインターフェイスが崩れたときに再描画するには Ctrl + L だけ覚えておけばよい
    $XDG_CONFIG_HOME/gdb/gdbinit には以下だけ入れている
    layout src
    set confirm off

    • カラープロンプトはこう書くのが好きだ
      set prompt \001\033[01;36m\002(gdb)\001\033[0m\002
      履歴はこう保存している
      set history save on
      set history size 500000
      set history filename ~/.cache/gdb/history
    • gdb-dashboard はよく使っていて、おすすめする。TUI に似ているが、表示する情報をいろいろ選んで入れられ、色のおかげで出力がずっと読みやすい
      ダッシュボードを別のターミナルや複数のターミナルに分けて表示することもできるので、より良いウィンドウ配置を作れる。以前 tmux でターミナル配置を自動生成して GDB に接続するスクリプトを書いたことがあるが、かなり手間はかかるものの、かなり良いレイアウトを作れた
    • Ctrl + L は TUI 系では必ず知っておくべきで、Vim の画面が崩れたときも含まれる。これを知ってから、謎めいた数々の「クラッシュ」が解決した
    • gef は tmux をサポートしていて、プログラム出力が別の tmux ペインに送られる
    • Emacs 内の gud-gdb フロントエンドはかなり便利で使いやすい
  • Windows から Linux に接続している場合や WSL を使っている場合でも、WinDBG/VisualStudio で Linux プロセスをリモートデバッグできる

    • リモート側で gdbserver が動いていればよい、ということではないのか?
  • これは GDB 用の Qt UI
    自分の知る限りでは、GDB 用の Web ベース UI である gdbgui もある: https://www.gdbgui.com/
    デバッグツール周りの動きが増えるのはいつでも良いことだ

    • Qt Creator では GDB が複雑な設定なしに動作する点が良い。ブレークポイントをいくつか置いて実行を押すだけで、IDE が残りを処理してくれる
    • GDB GUI のリストにもう一つ加えるなら、自分が作ったものもある: https://github.com/dzaima/grr
      まだ一部の用途には必須かもしれない機能がかなり抜けている。自分の使い方が主にアセンブリレベルのデバッグなので、派手な機能をあまり必要としなかったためだ
    • DDD もある。Motif フロントエンドだ
    • VS Code にもまずまずの GDB フロントエンドがあり、組み込みマイクロコントローラのデバッグ時には特に良い
    • Web ベースのデバッガーの話が出たついでに、最近 x86-64 アセンブリのデバッグに焦点を当てた似たプロジェクトを作った: https://github.com/robalb/x86-64-playground
  • 2年前にも中規模の議論があった: https://news.ycombinator.com/item?id=33044885

  • Emacsユーザーなら GUD はかなり優れたGDB統合

    • LSPが登場してから、Emacsが他のすべてより良く感じる。離れる理由がない。特にネイティブコンパイルで速くなってからはなおさら
      今月の新しいエディタがいくつかおもちゃみたいな機能を追加したからといって、試し続ける理由がない。Emacsにプラグインを1つ載せれば同じ機能が得られ、他の部分は自分の好きなやり方のまま保てる
      Atomがあった頃にコーディングに本格的にはまり、AtomがなくなってVS Codeになったのはかなり残念だった。VS Codeは良いが、Atomと同じ哲学に従っているわけではないからだ
      4年ほど前にEmacsを学んでから、新しいツールに「これは古い技術だから乗り換えるべきだ」と説得されたことはない。唐突な長広舌だけど、Emacsが生き残り続けてくれて本当にありがたい
    • GUD経由の基本統合である M-x gud-gdb より、Emacsの GDB Graphical Interface である M-x gdb のほうが好み
      最近lldbを実行するためにGUDへ切り替える必要があったが、ブレークポイント・スレッド・現在のスタックなどを表示する専用ウィンドウが恋しかった
      GUDの良いところは、デバッガが違ってもインターフェースが一貫していること。なのでpdbでPythonをデバッグしてからlldbでC++をデバッグしても、キーボードショートカットを覚え直す必要がない
      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#)は、Debug Adapter Protocolを実装したデバッガがある言語には良い選択肢
      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/

    • 20年前、大学でDDDを学んだが、その時点ですでに野暮ったく感じた。今はずっと寛容に見ているが、Motif は今でも目に障る
      数年にわたる会話を見ると、DDDは逆説的に優れた逆マーケティングツールであり、開発者たちを自分の好きなIDE内蔵のデバッガUIへ押し込んだようなものだった。DDD自体が非常に強力なのは確かだが、「有用性は美学より重要」にも限界はある
    • もちろんDDDはメンテナンス中。機能についてはここに書いた: https://begriffs.com/posts/2022-07-17-debugging-gdb-ddd.html
      記事を書いた後、メンテナたちが私の指摘した問題を修正してくれたので、今では多くの回避策は不要になっている。3.4.0と3.4.1 はかなり大きなリリース
    • DDDにさまざまな グラフィカルな可視化 が組み込まれている点が好き。特にデータ構造を可視化する機能はいつも素晴らしいと思っていた
      以前GTK3へ移植しようとするプロジェクトがあったが、消えてしまったようだ。それでもメインラインプロジェクトが続いているのは幸い
    • 私には、cygwin時代のWindowsでうまく動いていた、お気に入りのGDBフロントエンド Insight を思い出す。残念ながら、間違いなくもうメンテナンスされていない: https://sourceware.org/insight/screenshots.php
      それでも誰かがGitHubへ移して復活させ、少し作業したようではある: https://github.com/antony-jr/insight
    • DDDは素晴らしい。今でも使っているが、私は化石みたいな人間だ
      昔のSun Microsystemsマシンで使っていた dbxtool に似たものを探していてDDDを見つけた。今の人たちはソースレベルデバッグのようなもののおかげで、かなり贅沢をしている
  • GNUプロジェクトとRMSはミームのようにずいぶんからかわれているようだが、GDBは強力なツール だ。自分で触ったのは少しだけだが、長年にわたり開発者の仕事にものすごい影響を与えてきたように見える

    • 純粋に気になるのだが、GNU は何が理由でからかわれているのか?
  • 10年以上前、LinuxでC++を書いていたときは、内蔵デバッガのある Qt Creator を使っていた。GDBフロントエンドだが非常によく動き、C++とQtには他のものを使う理由を感じなかった