GNUデバッガ

GNUデバッガは、GNUソフトウェア・システムで動く標準のデバッガである。これは、多くのUnix系システムで動作可能な移植性の高いデバッガであり、Ada、C言語、C++、Objective-C、Pascal、FORTRAN、FreeBASIC、Goといったプログラミング言語に対応している。

1. 歴史
-----

GDBは初め、GNU Emacs が「そこそこ安定化」した後、1986年 にGNU システムの一部として リチャード・ストールマン が書いた。GDBは、GNU General Public License  の下でリリースしている フリーソフトウェア である。これは、BSDに付属していたdbx デバッガをモデルにしている。

1990年から1993年まではジョン・ギルモアが保守をしていた。現在はFree Software Foundationによって任命されたGDB運営委員会によって保守されている。

2. 技術詳細
-------

2.1. 機能
-------

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
MN10200 /
NS32K
Stormy16
V850
Z8000新しいリリースでは、これらの一部をサポートしていない可能性がある。GDBには、M32RやV850といった、日本製のCPUをターゲットにしたコンパイル済みのシミュレータがある。

GDBはまだ活発に開発されている。バージョン7.0の新機能には、Pythonスクリプトのサポートが含まれ、バージョン7.8ではGNU Guileスクリプトもサポートされている。バージョン7.0からは「リバーシブルデバッグ」がサポートされている。これは、クラッシュしたプログラムを巻き戻して何が起こったのかを確認するように、デバッグセッションを後退させることができる。

2.2. 遠隔デバッグ
-----------

GDBには「遠隔」モードがあり、しばしば組込みシステムのデバッグで使われる。遠隔操作では、GDBとデバッグ対象のプログラムは別のマシンで動作する。GDBは、GDBプロトコルをシリアルやTCP/IP経由で理解する遠隔「スタブ」と通信することができる。スタブプログラムは、通信プロトコルのターゲット側を実装したGDB付属の適切なスタブファイルにリンクすることで作成できる。または、gdbserverを使用して、プログラムを変更せずにリモートでデバッグすることもできる。

GDBを使い、動いているLinuxカーネルをソース・レベルでデバッグするKGDBでも、同じモードを使っている。KGDBを使い、カーネル開発者は、アプリケーション・プログラムのようにカーネルをデバッグできる。カーネル・コードにブレークポイントを設定でき、ステップ動作ができ、変数を参照できる。ハードウェアのデバッグ・レジスタ  が使えるアーキテクチャでは、ウォッチポイントが設定できる。ウォッチポイントとは、特定のメモリー・アドレスを実行したり、アクセスしたときのブレークポイントをかけるものである。KGDBには、シリアルケーブルやイーサネットを使ってデバッグ対象マシンに繋がったマシンが必要となる。FreeBSDでは、FireWire DMAを使ったデバッグもできる。

2.3. グラフィカルユーザーインタフェース
----------------------

このデバッガは、グラフィカルユーザインタフェース  は含まれておらず、デフォルトはコマンドラインユーザインタフェース  である。UltraGDB、Xxgdb、Data Display Debugger 、Nemiver、KDbg、Xcode デバッガ、GDBtk/Insight、HP Wildebeest Debugger GUI  など、いくつかのフロントエンドが構築されている。Codelite、Code::Blocks、Dev-C++、Geany、GNAT Programming Studio 、KDevelop、Qt Creator、Lazarus、MonoDevelop、Eclipse、NetBeans、Visual Studioなどの統合開発環境は、GDBとインターフェースをとることができる。GNU Emacsには「GUDモード」があり、VIM用のツールが存在する。これらのツールはIDEにあるデバッガと同様の機能を提供する。

他にも、メモリリーク検出器など、GDBと連動するように設計されたデバッグツールもある。

3. コマンド例
--------



4. セッション例
---------

C言語で書かれた以下のソースコードを考える。

include
include
include size_t foo_len { return strlen; }

int main { const char *a = NULL;

printf );

exit; }<WtXmlEndTag />

Linux上のGCCコンパイラを使用する場合、生成されたバイナリに適切なデバッグ情報を含めるために-gフラグを使用して上記のコードをコンパイルしなければならない。これにより、GDBを使用してバイナリを検査できる。上記のコードを含むファイルが example.c という名前であると仮定すると、コンパイルのためのコマンドは次の様になる。 $ gcc example.c -Og -g -o example そして、バイナリを実行できるようになった。 $ ./example Segmentation fault

サンプルコードを実行するとセグメンテーションフォールトが発生するので、GDBを使用して問題を検査することができる。 $ gdb ./example GNU gdb  Fedora  Copyright  2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /path/example...done.  run Starting program: /path/example

Program received signal SIGSEGV, Segmentation fault. 0x0000000000400527 in foo_len  at example.c:8 8 return strlen ;  print s $1 = 0x0<WtXmlEndTag />

この問題は8行目にあり、strlen関数を呼び出す際に発生する 。strlen の実装  に応じて出力が異なる場合がある。

コマンド bt でプログラムのスタック・トレースをとると、main関数からソースコードの階層を降りてstrlen関数が呼び出されている流れを確かめられる。 GNU gdb  7.3.1 Copyright  2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /tmp/gdb/example...done.  run Starting program: /tmp/gdb/example

Program received signal SIGSEGV, Segmentation fault. 0xb7ee94f3 in strlen  from /lib/i686/cmov/libc.so.6  bt

0 0xb7ee94f3 in strlen  from /lib/i686/cmov/libc.so.6
1 0x08048435 in foo_len  at example.c:8
2 0x0804845a in main  at example.c:16<WtXmlEndTag />

この問題を修正するには、変数 a  に有効な文字列を含まなければならない。コードの修正版は次の通りである。

include
include
include size_t foo_len { return strlen; }

int main { const char *a = "This is a test string";

printf );

exit; }<WtXmlEndTag />

GDB内で実行ファイルを再コンパイルして実行すると、正しい結果が得られるようになった。

GNU gdb  Fedora  Copyright  2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>... Reading symbols from /path/example...done.  run Starting program: /path/example size of a = 21 [Inferior 1  exited normally] GDBは printf の出力を画面に表示し、プログラムが正常に終了したことをユーザに知らせる。

5. 脚注
-----

6. 関連項目
-------

LLDB
Binary File Descriptor library 
dbx
DDD - GDBなどのデバッガのためのGUIグラフィカルユーザーインタフェース
gdbserver

7. 外部リンク
--------

[1]
[2]
[3] - htmlと400ページ以上のPDF
[4]
[5]

7.1. ドキュメント
-----------

Richard M. Stallman, Roland Pesch, Stan Shebs, et al., //Debugging with GDB//  ISBN 1-882114-88-4
[6]

7.2. チュートリアル
------------

[7]