GNUデバッガ
開発元GNUプロジェクト
初版1986年 (38年前) (1986)
最新版12.1[1] / 2022年5月1日 (2年前) (2022-05-01)
リポジトリ
sourceware.org/git/binutils-gdb.git
GNUデバッガ(単にGDBとも)は、GNUソフトウェア・システムで動く標準のデバッガである。これは、多くのUnix系システムで動作可能な移植性の高いデバッガであり、Ada、C言語、C++、Objective-C、Pascal、FORTRAN、FreeBASIC、Goといったプログラミング言語に対応している[2][3]。 GDBは初め、GNU Emacs が「そこそこ安定化」した後、1986年 にGNU システムの一部として リチャード・ストールマン が書いた[4]。GDBは、GNU General Public License (GPL) の下でリリースしている フリーソフトウェア である。これは、BSDに付属していたdbx
歴史
1990年から1993年まではジョン・ギルモアが保守をしていた[5]。現在はFree Software Foundationによって任命されたGDB運営委員会によって保守されている[6]。 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]。
GDBはまだ活発に開発されている。バージョン7.0の新機能には、Pythonスクリプトのサポートが含まれ[8]、バージョン7.8ではGNU Guileスクリプトもサポートされている[9]。バージョン7.0からは「リバーシブルデバッグ」がサポートされている。これは、クラッシュしたプログラムを巻き戻して何が起こったのかを確認するように、デバッグセッションを後退させることができる[10]。 GDBには「遠隔」モードがあり、しばしば組込みシステムのデバッグで使われる。遠隔操作では、GDBとデバッグ対象のプログラムは別のマシンで動作する。GDBは、GDBプロトコルをシリアルやTCP/IP経由で理解する遠隔「スタブ」と通信することができる[11]。スタブプログラムは、通信プロトコルのターゲット側を実装したGDB付属の適切なスタブファイルにリンクすることで作成できる[12]。または、gdbserver
遠隔デバッグ
GDBを使い、動いているLinuxカーネルをソース・レベルでデバッグするKGDBでも、同じモードを使っている。KGDBを使い、カーネル開発者は、アプリケーション・プログラムのようにカーネルをデバッグできる。カーネル・コードにブレークポイントを設定でき、ステップ動作ができ、変数を参照できる。ハードウェアのデバッグ・レジスタ (debugging register) が使えるアーキテクチャでは、ウォッチポイントが設定できる。ウォッチポイントとは、特定のメモリー・アドレスを実行したり、アクセスしたときのブレークポイントをかけるものである。KGDBには、シリアルケーブルやイーサネットを使ってデバッグ対象マシンに繋がったマシンが必要となる。FreeBSDでは、FireWire DMAを使ったデバッグもできる[13]。 このデバッガは、グラフィカルユーザインタフェース (GUI) は含まれておらず、デフォルトはコマンドラインユーザインタフェース (CUI) である。UltraGDB、Xxgdb、Data Display Debugger
グラフィカルユーザーインタフェース
他にも、メモリリーク検出器など、GDBと連動するように設計されたデバッグツールもある。 gdb program"program" をデバッグ (シェル上で操作) C言語で書かれた以下のソースコードを考える。#include <stdio.h>#include <stdlib.h>#include <string.h>size_t foo_len( const char *s ){ return strlen( s );}int main( int argc, char *argv[] ){ const char *a = NULL; printf( "size of a = %lu\n", foo_len(a) ); exit( 0 );} Linux上のGCCコンパイラを使用する場合、生成されたバイナリに適切なデバッグ情報を含めるために-gフラグを使用して上記のコードをコンパイルしなければならない。これにより、GDBを使用してバイナリを検査できる。上記のコードを含むファイルが example.c という名前であると仮定すると、コンパイルのためのコマンドは次の様になる。$ gcc example.c -Og -g -o example そして、バイナリを実行できるようになった。$ ./exampleSegmentation fault サンプルコードを実行するとセグメンテーションフォールトが発生するので、GDBを使用して問題を検査することができる。
コマンド例
run -vロードされたprogramをパラメータを指定して実行
btバックトレース (programがクラッシュした場合)
info registersすべてのレジスタをダンプ
disas $pc-32, $pc+32逆アセンブル(等価なコマンドは x/64i $pc-32[14] )
セッション例