GDB(GNU Debugger)とは?意味をわかりやすく簡単に解説
スポンサーリンク
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
- Windows 11 version 24H2がリリースプレビューに登場、新機能とCopilotアプリ化で利便性向上
- Windows 11とWindows 10の非推奨機能一覧公開、セキュリティ強化や新機能への移行が進む
- EmEditor v24.2.0リリース、AI機能とセキュリティが強化されユーザビリティが向上
- Android 15 Beta 2リリース、フォアグラウンドサービスと16KBページサイズの変更が目玉
- Windows 11にAIプラットフォーム「Copilot+ PCs」登場、高度なAIワークロードに対応
- 最新Surface ProとLaptopが登場、AIで進化するWindowsの新時代が幕開け
- Windows 10 Build 19045.4472がRelease Preview Channelに、Entra IDやWPFの問題など修正
- Microsoft 365アプリでアクセシブルなPDF作成が可能に、機能拡充でデジタルインクルージョンを促進
- Windows 11 Insider Preview Build 26217リリース、設定UIの改善とバグ修正が進行中
- Portmaster v1.6.10リリース、ICMPフィルタリング強化とバグ修正で利便性向上
スポンサーリンク