GNUデバッガ
開発元 GNUプロジェクト
初版 1986年 (40年前) (1986)
最新版
17.2[1] ウィキデータを編集 / 2026年5月10日 (36日前)
リポジトリ ウィキデータを編集
プログラミング
言語
C
対応OS Unix-like, Windows
種別 デバッガ
ライセンス GPL
公式サイト gnu.org/software/gdb/
テンプレートを表示

GNUデバッガ(単にGDBとも)は、GNUソフトウェア・システムで動く標準のデバッガである。これは、多くのUnix系システムで動作可能な移植性の高いデバッガであり、AdaC言語C++Objective-CPascalFORTRANFreeBASICGoといったプログラミング言語に対応している[2][3]

歴史

編集

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

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

技術詳細

編集

機能

編集

GDBは、プログラムの実行の変更や追跡といった充実した機能を提供する。プログラム内部の 変数 の値を修正したり、監視したりすることや、プログラムの通常の動作とは別に 関数 を呼び出すことができる。

2003年 現在、GDBのターゲット・プロセッサは、以下のとおりである。

標準リリースでサポートされている、さほど有名でないターゲット・プロセッサには、以下がある。

新しいリリースでは、これらの一部をサポートしていない可能性がある。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 (DDD)、NemiverKDbgXcode デバッガ、GDBtk/Insight、HP Wildebeest Debugger GUI (WDB GUI) など、いくつかのフロントエンドが構築されている。CodeliteCode::BlocksDev-C++GeanyGNAT Programming Studio (GPS)、KDevelopQt CreatorLazarusMonoDevelopEclipseNetBeansVisual Studioなどの統合開発環境は、GDBとインターフェースをとることができる。GNU Emacsには「GUDモード」があり、VIM用のツールが存在する(例: clewn)。これらのツールはIDEにあるデバッガと同様の機能を提供する。

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

コマンド例

編集
gdb program "program" をデバッグ (シェル上で操作)
run -v ロードされたprogramをパラメータを指定して実行
bt バックトレース (programがクラッシュした場合)
info registers すべてのレジスタをダンプ
disas $pc-32, $pc+32 逆アセンブル(等価なコマンドは x/64i $pc-32[14] )

セッション例

編集

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

そして、バイナリを実行できるようになった。

$ ./example
Segmentation fault

サンプルコードを実行するとセグメンテーションフォールトが発生するので、GDBを使用して問題を検査することができる。

$ gdb ./example
GNU gdb (GDB) Fedora (7.3.50.20110722-13.fc16)
Copyright (C) 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.
(gdb) run
Starting program: /path/example

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400527 in foo_len (s=0x0) at example.c:8
8	  return strlen (s);
(gdb) print s
$1 = 0x0

この問題は8行目にあり、strlen関数を呼び出す際に発生する (引数 sNULL であるため)。strlen の実装 (インライン関数かどうか) に応じて出力が異なる場合がある。

コマンド bt でプログラムのスタック・トレースをとると、main関数からソースコードの階層を降りてstrlen関数が呼び出されている流れを確かめられる。

GNU gdb (GDB) 7.3.1
Copyright (C) 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.
(gdb) run
Starting program: /tmp/gdb/example

Program received signal SIGSEGV, Segmentation fault.
0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6
(gdb) bt
#0  0xb7ee94f3 in strlen () from /lib/i686/cmov/libc.so.6
#1  0x08048435 in foo_len (s=0x0) at example.c:8
#2  0x0804845a in main (argc=<optimized out>, argv=<optimized out>) at example.c:16

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

#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 = "This is a test string";

  printf( "size of a = %lu\n", foo_len(a) );

  exit( 0 );
}

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

GDBは printf の出力を画面に表示し、プログラムが正常に終了したことをユーザに知らせる。

脚注

編集
  1. ^ Joël Brobecker (2026年5月10日). “GDB 17.2 released!” (英語). 2026年5月10日閲覧。
  2. ^ GDB Documentation - Supported Languages”. 2011年11月28日閲覧。
  3. ^ GDB Documentation - Summary”. 2011年11月28日閲覧。
  4. ^ a b Richard Stallman lecture at the Royal Institute of Technology, Sweden (1986-10-30)”. 2006年9月21日閲覧。 “Then after GNU Emacs was reasonably stable, which took all in all about a year and a half, I started getting back to other parts of the system. I developed a debugger which I called GDB which is a symbolic debugger for C code, which recently entered distribution. Now this debugger is to a large extent in the spirit of DBX, which is a debugger that comes with Berkeley Unix.”
  5. ^ John Gilmore (activist)”. hyperleap.com. 2020年10月19日閲覧。
  6. ^ GDB Steering Committee”. 2008年5月11日閲覧。
  7. ^ GDB Documentation - Summary - Contributors”. 2011年12月1日閲覧。
  8. ^ GDB 7.0 Release Notes”. 2011年11月28日閲覧。
  9. ^ Joel Brobecker (2014年7月29日). “GDB 7.8 released!”. 2014年7月30日閲覧。
  10. ^ Reverse Debugging with GDB”. 2014年1月20日閲覧。
  11. ^ Howto: GDB Remote Serial Protocol: Writing a RSP Server”. 2020年10月19日閲覧。
  12. ^ Implementing a remote stub”. 2020年10月19日閲覧。
  13. ^ Kernel debugging with Dcons”. 2020年10月19日閲覧。
  14. ^ 10.6 Examining Memory”. 2020年12月30日閲覧。

関連項目

編集


外部リンク

編集

ドキュメント

編集
  • Richard M. Stallman, Roland Pesch, Stan Shebs, et al., Debugging with GDB (Free Software Foundation, 2002) ISBN 1-882114-88-4
  • GDB Internals

チュートリアル

編集

📚 Artikel Terkait di Wikipedia

コンピュータ略語一覧

(Distributed Denial of Service) DDR Double Data Rate SDRAM DDT Dynamic Debugging Tool DES データ暗号化標準 (Data Encryption Standard) DFA 決定性有限オートマトン (Deterministic

コピーオンライト

14882:2011(通称C++11)においては、規格の要求に従う場合そのような実装を行えなくなった。 ^ Debugging Your Operating System: A Lesson In Memory Allocation • Lukasa's Echochamber ^ OSのデバッグ:メモリアロケーション講座

OpenCL

Intel SYCL upstreaming effort into Clang/LLVM ^ a b PTX and SASS Assembly Debugging NVIDIA ^ Kernelet: High-Throughput GPU Kernel Executions with Dynamic

メモリ安全性

2019年10月26日閲覧。.  ^ “Memory Debugging in Allinea DDT”. 2015年2月3日時点のオリジナルよりアーカイブ。2019年10月26日閲覧。 ^ “Using Valgrind's Memcheck Tool to Find Memory Errors and Leaks”

ランタイムエラー検出

におけるリソース競合の同時実行プロファイリング | Microsoft Learn ^ Find memory leaks with the CRT library | Microsoft Learn ^ Debugging a Stack Overflow - Windows drivers | Microsoft

System/360

System/360のシステムや周辺機器の写真を含む。 Dates of announcement, first ship and withdrawal of all models of the IBM System/360 IBM System 360 RPG Debugging Template and Keypunch Card

Forth

2006年6月19日閲覧。[リンク切れ] ^ Shoebridge, Peter (1998年12月21日). “Motorola Background Debugging Mode Driver for Windows NT”. 2006年6月19日閲覧。[リンク切れ] ^ Martin, Harold M.

オープンソースソフトウェア

code to qualified customers, enterprises, governments, and partners for debugging and reference purposes” ^ Stephen R. Walli (2005年3月24日). “Perspectives