Seer: Linux向けGDB用GUIフロントエンド
(github.com/epasveer)- 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:
- io.github.epasveer.seer
flatpak install flathub io.github.epasveer.seer
- 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件のコメント
Hacker News のコメント
Linux で Godot と一緒にビルドして少し使ってみたが、全体的には悪くないものの、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 を使っている場合でも、WinDBG/VisualStudio で Linux プロセスをリモートデバッグできる
これは GDB 用の Qt UI だ
自分の知る限りでは、GDB 用の Web ベース UI である gdbgui もある: https://www.gdbgui.com/
デバッグツール周りの動きが増えるのはいつでも良いことだ
まだ一部の用途には必須かもしれない機能がかなり抜けている。自分の使い方が主にアセンブリレベルのデバッグなので、派手な機能をあまり必要としなかったためだ
2年前にも中規模の議論があった: https://news.ycombinator.com/item?id=33044885
Emacsユーザーなら GUD はかなり優れたGDB統合
今月の新しいエディタがいくつかおもちゃみたいな機能を追加したからといって、試し続ける理由がない。Emacsにプラグインを1つ載せれば同じ機能が得られ、他の部分は自分の好きなやり方のまま保てる
Atomがあった頃にコーディングに本格的にはまり、AtomがなくなってVS Codeになったのはかなり残念だった。VS Codeは良いが、Atomと同じ哲学に従っているわけではないからだ
4年ほど前にEmacsを学んでから、新しいツールに「これは古い技術だから乗り換えるべきだ」と説得されたことはない。唐突な長広舌だけど、Emacsが生き残り続けてくれて本当にありがたい
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...
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は逆説的に優れた逆マーケティングツールであり、開発者たちを自分の好きなIDE内蔵のデバッガUIへ押し込んだようなものだった。DDD自体が非常に強力なのは確かだが、「有用性は美学より重要」にも限界はある
記事を書いた後、メンテナたちが私の指摘した問題を修正してくれたので、今では多くの回避策は不要になっている。3.4.0と3.4.1 はかなり大きなリリース
以前GTK3へ移植しようとするプロジェクトがあったが、消えてしまったようだ。それでもメインラインプロジェクトが続いているのは幸い
それでも誰かがGitHubへ移して復活させ、少し作業したようではある: https://github.com/antony-jr/insight
昔のSun Microsystemsマシンで使っていた dbxtool に似たものを探していてDDDを見つけた。今の人たちはソースレベルデバッグのようなもののおかげで、かなり贅沢をしている
GNUプロジェクトとRMSはミームのようにずいぶんからかわれているようだが、GDBは強力なツール だ。自分で触ったのは少しだけだが、長年にわたり開発者の仕事にものすごい影響を与えてきたように見える
10年以上前、LinuxでC++を書いていたときは、内蔵デバッガのある Qt Creator を使っていた。GDBフロントエンドだが非常によく動き、C++とQtには他のものを使う理由を感じなかった