【入門編】GDBの「TUIモード」で劇的に効率化!画面分割でコードを見ながらデバッグする方法 – デバッグ・コード品質・テストツール生産性向上バイブル

こんにちは!日々のデバッグ作業、お疲れ様です。
黒い画面に流れる文字を睨みながら、「今、変数の中身はどうなっているんだっけ?」「ソースコードのどのあたりを実行しているんだっけ?」と頭の中で必死にメモリ空間をマッピングしていませんか?

C言語やC++、あるいはRustなどの低レイヤ寄りの開発において、GDB(GNU Debugger)はなくてはならない相棒です。しかし、標準のGDBはコマンドライン(CLI)だけ。ブレークポイントを張って、`print`コマンドで変数を覗いて……という作業を繰り返していると、全体像を見失いそうになりますよね。

「もっとこう、VisualStudioやVS Codeみたいに、ソースコードと変数の状態を同時に見ながらサクサク進められたらいいのに……」

実は、それを外部の重いIDEを入れずとも、GDB標準の機能だけで完璧に実現する方法があるのです。それが今回ご紹介する TUI(Text User Interface)モード です。

これをマスターすれば、毎日のコーディングが劇的に楽になりますよ。さあ、一緒に低レイヤデバッグの新しい世界へ足を踏み入れましょう!

—

1. GDB TUIモードとは何か?なぜ現場のプロが推すのか

GDBのTUIモードは、ターミナル画面を分割し、上部にC/C++のソースコード、下部にGDBのコマンドラインを同時に表示してくれる機能です。

従来のCLIデバッグが抱えるストレス

普通のGDBでデバッグしていると、こういう状況に陥ります。
1. `list`コマンドでソースコードを表示する。
2. `break main`でブレークポイントを張る。
3. `run`で実行する。
4. ステップ実行するたびに、今どこを実行しているか忘れるので、また`list`を叩く。
5. レジスタやアセンブリを見たいときは、画面が流れてパニックになる。

TUIモードがもたらす圧倒的な認知負荷の軽減

TUIモードを有効にすると、ブレークポイントにヒットした瞬間、ソースコードの該当行がハイライト(逆光表示)され、今どこでプログラムが停止しているのかが直感的に一目でわかります。

さらに、メモリやレジスタのウィンドウを同時に展開すれば、CPUの内部で何が起きているのかを生々しく観察できるようになります。「バグを探す」のではなく、「バグを視覚的に追い詰める」という感覚に変わるため、デバッグスピードが文字通り何倍にも跳ね上がります。

—

2. 環境構築と「今すぐ試せる」最小セットアップ

特別なプラグインのインストールは不要です。現代のLinux環境(Ubuntu, Debian, CentOSなど)やmacOS(Homebrew経由のGDB)であれば、標準でTUIが組み込まれています。

最低限必要なコンパイルの作法(超重要)

GDBでソースコードを表示させるためには、コンパイラ(`gcc`など)に対して「デバッグ情報を埋め込め」と指示する必要があります。これがないと、TUIモードにしても「No source file available(ソースファイルが見つかりません)」と怒られてしまいます。

以下のシンプルなC言語のコードを用意してください。

ファイル名: `hello_tui.c`

include

// 計算処理を行うだけのシンプルな関数
int calculate_sum(int a, int b) {
int result = a + b;
return result;
}

int main(void) {
printf(“GDB TUI Debugging Start!\n”);

int x = 10;
int y = 20;
int sum = calculate_sum(x, y);

printf(“The sum is: %d\n”, sum);

return 0;
}

デバッグ情報付きのコンパイルコマンド

ターミナルで以下のコマンドを実行します。

-g オプションが「デバッグ情報をバイナリに含める」という魔法のスイッチです
gcc -g -O0 hello_tui.c -o hello_tui

  • `-g`: 変数名やソースコードの行番号などのデバッグシンボルを生成します。
  • `-O0`: 最適化を切ります(最適化が効いていると、変数がレジスタに直に割り当てられてソースと一致しなくなるため、デバッグ時は必須です)。

—

3. TUIモードの起動と、画面を自在に操る基本操作

それでは、実際にTUIモードを起動してみましょう。

起動方法その1:コマンドラインから直接スイッチする

GDBを起動する際に、`-tui`オプションを付与します。

gdb -tui ./hello_tui

起動方法その2:通常のGDB起動後に切り替える

すでに通常のGDBで起動してしまっている場合でも、ショートカットキー一発でTUIモードに入れます。

1. 通常起動:`gdb ./hello_tui`
2. キーボードで `Ctrl` + `X` を押したあと、続けて `A` を押す(`Ctrl + X, A` と表記されます)。

これで、パッと画面が上下に分割され、上部に`hello_tui.c`のソースコードが表示されたはずです!

—

知っておくべき最強のショートカットキー操作

TUIモードに入ると、最初は「どこにフォーカス(入力権)があるの?」と戸惑うことがあります。以下の4つだけ覚えておけば十分です。

| 操作・ショートカット | 役割 |
| :— | :— |
| `Ctrl` + `X`, `A` | TUIモードのON / OFFを切り替える |
| `Ctrl` + `P` / `Ctrl` + `N` | ソースコードウィンドウ内で、上下にスクロールする(※フォーカスがソースにある時) |
| `Ctrl` + `X` のあと `O` (英字のオー) | フォーカスを「ソースウィンドウ」と「GDBコマンドライン」の間で切り替える |
| `Ctrl` + `L` | 画面の描画がおかしくなった時(ターミナルサイズ変更時など)に画面を再描画する |

—

4. レジスタ・メモリを同時表示!現場で役立つレイアウト変更術

TUIの真骨頂は、ソースコードだけでなく、CPUのレジスタやアセンブリコードを同時に見られることです。レイアウトを変更してみましょう。

GDBのプロンプト(あるいはTUIのコマンド入力部)から、以下のコマンドを叩いてみてください。

レイアウトの変更コマンド

ソースコードと、アセンブリ(逆アセンブル結果)を同時に表示する
(gdb) layout asm

ソースコードと、CPUのレジスタ状態を同時に表示する(超実用的!)
(gdb) layout regs

`layout regs` を実行すると、画面が3分割(上:ソース、中:レジスタ、下:コマンド)され、ステップ実行するたびに値が変化したレジスタが赤くハイライトされます。低レイヤのバグ(ポインタの不正参照やレジスタの破損など)を追うとき、これほど頼もしい機能はありません。

もしレイアウトがごちゃごちゃして元に戻したい場合は、いつでもリセット可能です。

(gdb) layout src

—

5. 実践!TUIモードでコードをデバッグしてみよう

実際にブレークポイントを張って、コードを動かしてみましょう。TUIモードの画面がどのように連動するのか体験してください。

1. main関数にブレークポイントをセット
(gdb) break main

2. プログラムを実行
(gdb) run

このコマンドを打つと、GDBは`main`関数の先頭で停止し、上部のソースコードウィンドウの該当行が矢印(`->`)とハイライトで示されます。

ここから先は、普段通りのGDBコマンドがそのまま使えます。

  • `next` (または `n`): 関数をまたがずに次の行へ進む(ステップオーバー)
  • `step` (または `s`): 関数の中へ潜り込む(ステップイン)
  • `print sum`: 変数 `sum` の中身を確認する

ソースコードウィンドウを見ながら `n` を連打するだけで、まるで最新の統合開発環境(IDE)でデバッグしているかのような快適さが手に入ります。

—

6. さらに開発効率を爆上げする .gdbinit 設定の極意

毎回GDBを起動するたびに `layout regs` を打ったり、見づらい配色を調整したりするのは面倒ですよね。ホームディレクトリに `.gdbinit` という設定ファイルを置いておけば、自分好みの最強デバッグ環境を自動構築できます。

以下の設定をホームディレクトリ(`~/.gdbinit`)に書き込んでみてください。

ファイルパス: `~/.gdbinit`

起動時に安全性を確認するプロンプトを非表示にする(ローカル開発用)
set pagination off

TUIモード時のボーダー(枠線)を美しく表示する設定
set tui border-kind acs

独自コマンドの定義:’lt’ と打つだけで「ソース+レジスタ」のTUIを起動する
define lt
tui enable
layout regs
end
document lt
Enable TUI mode with source and registers layout.
end

この設定を入れておけば、今後は単に `gdb ./hello_tui` で起動したあと、コマンドラインで `lt` と打つだけで、一瞬でソースコードとレジスタが同期するプロ仕様のデバッグ画面が立ち上がります。

—

先輩エンジニアからのエール

お疲れ様でした!これであなたも、重いIDEに依存せず、SSH先の軽量なリモートサーバーやコンテナ環境の中でも、洗練されたビジュアルでデバッグを行えるスキルを手に入れました。

「黒い画面でのデバッグは味気なくて苦手だ」と感じていた方こそ、GDBのTUIモードの快適さに驚くはずです。最初はショートカットキーに戸惑うかもしれませんが、1日使えばすぐに手が覚えます。

この機能が、あなたの毎日のコーディングをより楽しく、より確実なものにしてくれることを心から願っています。バグを華麗に追い詰めて、爽やかに定時退社しましょう!

タイトルとURLをコピーしました