GNUデバッガ

GNUデバッガ(GDB)とは



GNUデバッガ(GDB)は、GNUソフトウェアシステムにおける標準的なデバッガです。多様なUnix系システムで動作する高い移植性を持ち、Ada、C、C++Objective-CPascal、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

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。