公開:

GDB(GNU Debugger)とは?意味をわかりやすく簡単に解説

text: XEXEQ編集部


GDB(GNU Debugger)とは

GDBはGNU Debuggerの略称で、プログラムのデバッグに使用されるツールです。C、C++、Objective-C、Fortran、Pascalなど、様々なプログラミング言語で書かれたプログラムをデバッグすることができます。

GDBを使用することで、プログラムの実行中にブレークポイントを設定し、変数の値を確認したり、ステップ実行を行ったりすることが可能です。これにより、プログラムの動作を詳細に分析し、バグの原因を特定することができるのです。

また、GDBはコマンドラインベースのツールであるため、GUIを必要とせずに操作することができます。そのため、リモートサーバー上でのデバッグや、自動化されたテストの実行にも適しています。

GDBはLinuxやmacOSなどのUNIX系オペレーティングシステムで広く使用されています。Windowsでも、Cygwinなどの環境を使用することで、GDBを利用可能です。

プログラムのデバッグは開発プロセスにおいて非常に重要な作業です。GDBを効果的に活用することで、バグの発見と修正を効率的に行い、高品質なソフトウェアを開発することができるでしょう。

GDBを使ったデバッグの基本的な流れ

GDBを使ったデバッグの基本的な流れに関して、以下3つを簡単に解説していきます。

  • GDBの起動とプログラムのロード
  • ブレークポイントの設定とプログラムの実行
  • 変数の値の確認とステップ実行

GDBの起動とプログラムのロード

GDBを使ってデバッグを開始するにはまずGDBを起動し、デバッグ対象のプログラムをロードする必要があります。コマンドラインでGDBと入力し、続けてプログラムの実行ファイル名を指定することで、GDBが起動し、プログラムがロードされます。

例えば、mainという実行ファイルをデバッグする場合は以下のようにコマンドを入力します。

$ GDB main

ブレークポイントの設定とプログラムの実行

プログラムをロードした後、デバッグしたい箇所にブレークポイントを設定します。ブレークポイントを設定することで、プログラムの実行がその地点で一時停止し、変数の値を確認したり、ステップ実行を行ったりすることができるようになります。

ブレークポイントはbreakコマンドまたはbコマンドを使用して設定します。行番号や関数名を指定することで、任意の場所にブレークポイントを設定できるのです。

ブレークポイントを設定した後、runコマンドまたはrコマンドを使ってプログラムを実行します。プログラムは設定したブレークポイントで一時停止するでしょう。

変数の値の確認とステップ実行

プログラムがブレークポイントで一時停止した状態で、printコマンドを使用して変数の値を確認することができます。変数名を指定することで、その変数の現在の値が表示されます。

また、stepコマンドやnextコマンドを使用して、プログラムをステップ実行することも可能です。stepコマンドは関数の内部に入り込んで実行を進めるのに対し、nextコマンドは関数呼び出しを1ステップでまとめて実行します。

これらのコマンドを駆使することで、プログラムの動作を詳細に追跡し、バグの原因を特定していくことができるのです。

GDBを使ったメモリやポインタのデバッグ

GDBを使ったメモリやポインタのデバッグに関して、以下3つを簡単に解説していきます。

  • メモリの内容の確認
  • ポインタの値の確認
  • メモリリークの検出

メモリの内容の確認

GDBを使用すると、プログラムの実行中に任意のメモリアドレスの内容を確認することができます。xコマンドを使用して、メモリアドレスを指定し、そのアドレスから始まるメモリの内容を表示できるのです。

例えば、0x1000番地から始まる16バイトのメモリの内容を表示するには以下のようにコマンドを入力します。

(GDB) x/16xb 0x1000

ポインタの値の確認

ポインタ変数の値を確認することはメモリ関連のバグを追跡する上で非常に重要です。GDBのprintコマンドを使用して、ポインタ変数の値を表示することができます。

また、printコマンドに*を付けることで、ポインタが指し示すメモリアドレスの内容を表示することも可能です。これにより、ポインタが正しいメモリアドレスを指しているかどうかを確認できるでしょう。

以下はptrというポインタ変数の値とそれが指し示すメモリアドレスの内容を表示する例です。

(GDB) print ptr
(GDB) print *ptr

メモリリークの検出

メモリリークはプログラムが動的に割り当てたメモリを解放せずに放置することで発生します。GDBを使用すると、プログラムの実行中にメモリリークを検出することができます。

GDBにはメモリリークを検出するための専用のコマンドはありませんが、printコマンドを使ってメモリの割り当てと解放の状況を追跡することで、メモリリークを発見できる場合があります。

また、GDBと連携して使用できるメモリリーク検出ツール(例えば、Valgri ndなど)を利用することで、より効果的にメモリリークを検出することが可能です。

GDBを使ったマルチスレッドプログラムのデバッグ

GDBを使ったマルチスレッドプログラムのデバッグに関して、以下3つを簡単に解説していきます。

  • スレッドの一覧表示
  • 特定のスレッドでのブレークポイントの設定
  • スレッド間の切り替え

スレッドの一覧表示

マルチスレッドプログラムをデバッグする際、まず各スレッドの状況を把握する必要があります。GDBのinfo threadsコマンドを使用することで、現在のプログラムで実行中のスレッドの一覧を表示できます。

表示される情報にはスレッドID、スレッドの状態、現在の実行位置などが含まれます。これにより、デバッグ対象のスレッドを特定することができるでしょう。

info threadsコマンドの出力例を以下に示します。

(GDB) info threads
Id Target Id Frame 
* 1 Thread 0x7ffff7fe1740 (LWP 12345) "main" main () at main.c:10
2 Thread 0x7ffff7fe0700 (LWP 12346) "worker" worker () at main.c:20

特定のスレッドでのブレークポイントの設定

特定のスレッドでブレークポイントを設定するにはまずthreadコマンドを使用してデバッグ対象のスレッドに切り替える必要があります。その後、通常のブレークポイントの設定と同様に、breakコマンドを使用してブレークポイントを設定します。

以下はスレッドID 2に切り替えて、worker関数の先頭にブレークポイントを設定する例です。

(GDB) thread 2
(GDB) break worker

スレッド間の切り替え

デバッグ中に、別のスレッドの状態を確認したい場合があります。GDBではthreadコマンドを使用してスレッド間を切り替えることができます。

threadコマンドに続けてスレッドIDを指定することで、任意のスレッドに切り替えられます。現在のスレッドから別のスレッドに切り替えると、そのスレッドの現在の実行位置が表示されるでしょう。

以下はスレッドID 1に切り替える例です。

(GDB) thread 1
「コンピュータ」に関するコラム一覧「コンピュータ」に関するニュース一覧
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。