GNUデバッガ(GDB)とは
GNU
デバッガ(GDB)は、GNUソフトウェアシステムにおける標準的な
デバッガです。多様な
Unix系システムで動作する高い移植性を持ち、
Ada、C、
C++、
Objective-C、
Pascal、FORTRAN、
FreeBASIC、Goといった多くの
プログラミング言語をサポートしています。
歴史
GDBは、
GNU Emacsが安定化した後の
1986年に、リチャード・ストールマンによってGNUシステムの一部として開発されました。BSDのdbx
デバッガをモデルとしており、
GNU General Public License (GPL) の下で公開されている自由ソフトウェアです。
1990年から
1993年まではジョン・ギルモアが保守を担当し、現在はFree Software Foundationによって任命されたGDB運営委員会が保守を行っています。
技術詳細
機能
GDBは、プログラムの実行変更や追跡といった強力な機能を提供します。プログラム内の変数の値を監視・修正したり、関数を呼び出すことが可能です。
2003年時点で、GDBは以下のプロセッサをターゲットとしていました。
Alpha
ARM
AVR
Altera Nios/Nios II
H8/300
System/370 / System 390
x86 / x64
IA-64 (
Itanium)
Motorola 68000
MIPS
PA-RISC
PowerPC
SuperH
SPARC
VAX
また、以下のプロセッサもサポートされていますが、新しいリリースでは一部サポートが打ち切られる可能性もあります。
AMD 29000
ARC
CRIS
D10V / D30V
FR-30 / FR-V
Intel i960
M32R
68HC11
Motorola 88000
MCORE
MN10200 / MN10300
NS32K
Stormy16
V850
Z8000
GDBは、M32RやV850といった日本製のCPUをターゲットとしたシミュレータも提供しており、現在も活発に開発が進められています。バージョン7.0では
Pythonスクリプトのサポートが、バージョン7.8では
GNU Guileスクリプトのサポートが追加されました。また、バージョン7.0からは「リバーシブルデバッグ」が導入され、プログラムの実行を巻き戻してエラーの原因を追跡できるようになりました。
遠隔デバッグ
GDBは「遠隔」モードに対応しており、組み込みシステムのデバッグによく利用されます。このモードでは、GDBとデバッグ対象のプログラムが異なるマシン上で動作します。GDBは、シリアルまたはTCP/IP経由でGDBプロトコルを解釈する遠隔「スタブ」と通信します。スタブプログラムは、GDB付属の適切なスタブファイルにリンクすることで作成できます。また、gdbserverを使用すれば、プログラムを変更せずにリモートデバッグが可能です。
GDBは、
LinuxカーネルをソースレベルでデバッグするKGDBでも利用されています。KGDBを利用することで、カーネル開発者はアプリケーションプログラムと同じようにカーネルをデバッグできます。カーネルコードにブレークポイントを設定したり、ステップ実行や変数の参照が可能です。ハードウェアのデバッグレジスタが使用可能なアーキテクチャでは、特定のメモリアドレスへのアクセスをトリガーとするウォッチポイントを設定できます。KGDBには、シリアルケーブルや
イーサネットで接続された別のマシンが必要です。FreeBSDでは、FireWire DMAを利用したデバッグも可能です。
グラフィカルユーザーインタフェース
GDB自体はグラフィカルユーザーインターフェース(GUI)を備えておらず、デフォルトはコマンドラインインターフェース(CUI)です。しかし、UltraGDB、Xxgdb、Data Display Debugger (DDD)、Nemiver、KDbg、
Xcodeデバッガ、GDBtk/Insight、HP Wildebeest Debugger GUI (WDB GUI) などのGUIフロントエンドが構築されています。
また、Codelite、
Code::Blocks、Dev-
C++、
Geany、GNAT Programming Studio (GPS)、
KDevelop、Qt Creator、Lazarus、MonoDevelop、Eclipse、
NetBeans、Visual Studioといった
統合開発環境(IDE)もGDBと連携できます。
GNU Emacsには「GUDモード」が、VIMには「clewn」のようなツールが存在し、IDEの
デバッガと同様の機能を提供します。
さらに、メモリリーク検出器など、GDBと連携するデバッグツールも存在します。
コマンド例
以下は、
C言語の簡単な例を通してGDBの使用方法を示します。
c
include
include
int main() {
char
a = NULL;
printf("%d
", strlen(a));
return 0;
}
上記のコードをコンパイルする際は、デバッグ情報を含めるために `-g` フラグを使用する必要があります。
bash
gcc -g example.c -o example
プログラムを実行するとセグメンテーションフォールトが発生するため、GDBを使用して問題を解析できます。
bash
gdb example
GDB内で `run` コマンドを実行するとエラーが発生し、`bt` コマンドでスタックトレースを表示することで、問題がstrlen関数をNULL引数で呼び出していることが分かります。
bash
(gdb) run
...
Program received signal SIGSEGV, Segmentation fault.
...
(gdb) bt
0 strlen () at ../sysdeps/x86_64/strlen.S:106
1 0x000000000040113b in main () at example.c:8
この問題を修正するには、変数 `a` に有効な文字列を代入する必要があります。
c
include
include
int main() {
char a = "hello";
printf("%d
", strlen(a));
return 0;
}
修正後のコードをコンパイルして実行すると、正しく動作するようになります。
bash
gcc -g example.c -o example
gdb example
(gdb) run
5
...
Program exited normally.
脚注
GDBは、プログラムのデバッグにおいて非常に強力なツールであり、多くのプログラマにとって不可欠な存在です。さまざまなプラットフォームや
プログラミング言語に対応しており、組み込みシステム開発から大規模なアプリケーション開発まで、幅広い用途に活用されています。
関連項目
LLDB
Binary File Descriptor library (libbfd)
dbx
DDD - GDBなどの
デバッガのためのGUI
gdbserver
外部リンク
GDB公式Webサイト
KGDB: Linux Kernel Source Level Debugger
Debugging with GDB
A Visual Studio plugin for debugging with GDB
Comparison of GDB front-ends, 2013
ドキュメント
Richard M. Stallman, Roland Pesch, Stan Shebs, et al., Debugging with GDB (Free Software Foundation, 2002) ISBN 1-882114-88-4
GDB Internals
チュートリアル
*
RMS's gdb Tutorial