Linux gdb コマンド
GDB (GNU Debugger) は Linux システムで最も一般的に使用されるプログラムデバッグツールであり、開発者が次のことを行うのに役立ちます:
- プログラムの実行フローを追跡する
- ブレークポイントを設定してプログラムの実行を一時停止する
- 変数の値を表示および変更する
- プログラムのクラッシュ原因を分析する
- 関数の呼び出しスタックを確認する
GDB は C、C++、Objective-C、Fortran、Ada など、多くのプログラミング言語をサポートしており、Linux 開発者にとって欠かせないデバッグツールです。
gdb のインストール
ほとんどの Linux ディストリビューションでは、gdb はパッケージマネージャで簡単にインストールできます。
例
# Ubuntu/Debian
sudo apt-get install gdb
# CentOS/RHEL
sudo yum install gdb
# Fedora
sudo dnf install gdb
# Arch Linux
sudo pacman -S gdb
sudo apt-get install gdb
# CentOS/RHEL
sudo yum install gdb
# Fedora
sudo dnf install gdb
# Arch Linux
sudo pacman -S gdb
インストールが完了したら、次のコマンドでインストールが成功したかどうかを確認できます。
gdb --version
デバッグ可能なプログラムのコンパイル
gdb でプログラムをデバッグするには、コンパイル時に追加する必要があります。-gデバッグ情報を生成するオプション:
gcc -g program.c -o program
-gこのオプションは、実行ファイルにソースコード情報を埋め込み、gdb がマシン命令をソースコードに対応付けることを可能にします。
基本的な gdb コマンド
gdb の起動と終了
例
# gdb を起動してプログラムを読み込む
gdb ./program
# gdb を起動して実行中のプロセスにアタッチする
gdb -p PID
# gdb を終了する
(gdb) quit
# または短縮形
(gdb) q
gdb ./program
# gdb を起動して実行中のプロセスにアタッチする
gdb -p PID
# gdb を終了する
(gdb) quit
# または短縮形
(gdb) q
プログラムの実行
例
# プログラムを実行する
(gdb) run
# または短縮形
(gdb) r
# 引数付きで実行する
(gdb) run arg1 arg2
(gdb) run
# または短縮形
(gdb) r
# 引数付きで実行する
(gdb) run arg1 arg2
ブレークポイントの管理
例
# 指定した行にブレークポイントを設定する
(gdb) break 10
# または短縮形
(gdb) b 10
# 関数の入口にブレークポイントを設定する
(gdb) break main
(gdb) break function_name
# すべてのブレークポイントを表示する
(gdb) info breakpoints
# ブレークポイントを削除する
(gdb) delete 1 # 番号1のブレークポイントを削除する
(gdb) delete # すべてのブレークポイントを削除する
(gdb) break 10
# または短縮形
(gdb) b 10
# 関数の入口にブレークポイントを設定する
(gdb) break main
(gdb) break function_name
# すべてのブレークポイントを表示する
(gdb) info breakpoints
# ブレークポイントを削除する
(gdb) delete 1 # 番号1のブレークポイントを削除する
(gdb) delete # すべてのブレークポイントを削除する
プログラム実行の制御
例
# 次のブレークポイントまで実行を継続する
(gdb) continue
# または短縮形
(gdb) c
# ステップ実行(関数に入る)
(gdb) step
# または短縮形
(gdb) s
# ステップ実行(関数に入らない)
(gdb) next
# または短縮形
(gdb) n
# 現在の関数を実行して呼び出し元に戻る
(gdb) finish
(gdb) continue
# または短縮形
(gdb) c
# ステップ実行(関数に入る)
(gdb) step
# または短縮形
(gdb) s
# ステップ実行(関数に入らない)
(gdb) next
# または短縮形
(gdb) n
# 現在の関数を実行して呼び出し元に戻る
(gdb) finish
コードの表示
例
# 現在の行の周辺のコードを表示する
(gdb) list
# または短縮形
(gdb) l
# 指定した行の周辺のコードを表示する
(gdb) list 15
# 指定した関数のコードを表示する
(gdb) list main
(gdb) list
# または短縮形
(gdb) l
# 指定した行の周辺のコードを表示する
(gdb) list 15
# 指定した関数のコードを表示する
(gdb) list main
変数とメモリの確認
例
# 変数の値を表示する
(gdb) print variable_name
# または短縮形
(gdb) p variable_name
# 変数の値を変更する
(gdb) print variable_name = new_value
# 変数の型を表示する
(gdb) ptype variable_name
# メモリの内容を表示する
(gdb) x/10xw &variable # 16進数で10ワード(word)を表示する
(gdb) print variable_name
# または短縮形
(gdb) p variable_name
# 変数の値を変更する
(gdb) print variable_name = new_value
# 変数の型を表示する
(gdb) ptype variable_name
# メモリの内容を表示する
(gdb) x/10xw &variable # 16進数で10ワード(word)を表示する
コールスタックの解析
例
# コールスタックを表示する
(gdb) backtrace
# または短縮形
(gdb) bt
# 指定したスタックフレームに切り替える
(gdb) frame 2
# または短縮形
(gdb) f 2
(gdb) backtrace
# または短縮形
(gdb) bt
# 指定したスタックフレームに切り替える
(gdb) frame 2
# または短縮形
(gdb) f 2
高度なデバッグテクニック
条件付きブレークポイント
例
# i が5のときにブレークポイントをトリガーする
(gdb) break 10 if i == 5
(gdb) break 10 if i == 5
ウォッチポイント
例
# 変数が変更されたときに一時停止する
(gdb) watch variable_name
# 変数が読み取られたときに一時停止する
(gdb) rwatch variable_name
# 変数が読み取りまたは変更されたときに一時停止する
(gdb) awatch variable_name
(gdb) watch variable_name
# 変数が読み取られたときに一時停止する
(gdb) rwatch variable_name
# 変数が読み取りまたは変更されたときに一時停止する
(gdb) awatch variable_name
マルチスレッドのデバッグ
例
# すべてのスレッドを表示する
(gdb) info threads
# 指定したスレッドに切り替える
(gdb) thread 2
# 現在のスレッドのみ実行を許可する
(gdb) set scheduler-locking on
(gdb) info threads
# 指定したスレッドに切り替える
(gdb) thread 2
# 現在のスレッドのみ実行を許可する
(gdb) set scheduler-locking on
コアダンプファイルのデバッグ
例
# コアダンプファイルを読み込む
gdb ./program core
# クラッシュ時のコールスタックを表示する
(gdb) bt
gdb ./program core
# クラッシュ時のコールスタックを表示する
(gdb) bt
gdb グラフィカルインターフェース
gdb はグラフィカルインターフェースモードもサポートしており、使用できます。-tui起動オプション:
gdb -tui ./program
または使用中に切り替えます:
例
(gdb) layout src # ソースコードウィンドウを表示する
(gdb) layout asm # アセンブリウィンドウを表示する
(gdb) layout regs # レジスタウィンドウを表示する
(gdb) layout split # ソースコードとアセンブリを同時に表示する
(gdb) layout asm # アセンブリウィンドウを表示する
(gdb) layout regs # レジスタウィンドウを表示する
(gdb) layout split # ソースコードとアセンブリを同時に表示する
実用的な gdb 設定
よく使う設定を追加できます。~/.gdbinitファイルに:
例
# プリティプリントを有効にする
set print pretty on
# 履歴のサイズを設定する
set history save on
set history size 1000
# カスタムコマンド
define printarray
set $i = 0
while $i < $arg0
printf "array[%d] = %dn", $i, $arg1[$i]
set $i = $i + 1
end
end
set print pretty on
# 履歴のサイズを設定する
set history save on
set history size 1000
# カスタムコマンド
define printarray
set $i = 0
while $i < $arg0
printf "array[%d] = %dn", $i, $arg1[$i]
set $i = $i + 1
end
end
よくある問題の解決
デバッグ中にソースコードが表示されない
- コンパイル時に使用したことを確認してください。
-gオプション - ソースコードがコンパイル時の場所にあるか確認する
- 使用する
directoryコマンドでソースコードのパスを追加します:
(gdb) directory /path/to/source
最適化されたコードのデバッグ
最適化によってコードの実行順序が変わり、デバッグが困難になる場合があります。デバッグ時は最適化を無効にすることをお勧めします:
gcc -O0 -g program.c -o program
まとめ
gdb は Linux で強力なデバッグツールであり、これを習得するとデバッグ効率を大幅に向上させることができます。この記事では gdb の基本的な使い方とよく使うコマンドを紹介しました。実際のデバッグ練習を通じてこれらの知識を定着させることをお勧めします。経験を積むにつれて、gdb がさまざまな複雑なデバッグ問題の解決に役立つことがわかるでしょう。
その他の拡張
Linux コマンド大全