Linux Cプログラミング学習の開発ツール2---GDBデバッガ

4618 ワード

概要
GDBは強力なインタラクティブプログラムデバッグツールで、主に文字インタフェースの下で動作します.
GDBはC/C++言語で作成されたプログラムをデバッグするだけでなく、Pascal、Objective-C、Fortranなどの言語で作成されたプログラムをデバッグするためにも使用できます.
 
GDB共通コマンド
GDBデバッガには、簡単なファイル読み込み、ブレークポイント設定から複雑なメモリ表示、信号キャプチャなど、多くのコマンドがあります.
GDBデバッガを使用する前に、-gオプションを使用してソースファイルをgcc(またはg+)でコンパイルし、デバッグするプログラムにデバッグ情報を追加する必要があります.また、gccの-個のオプションは最適化オプションと一緒に使用できません.
GDBの基本コマンドには、GDBの起動と終了、プログラムのロード、ソースコードのリスト、プログラムの実行、ヘルプ機能の使用などがあります.
1.GDBの起動と退出
コマンドラインにgdbを直接入力するとgdbのインタラクティブモードに入ります
gdbのインタラクティブモードでは、qコマンドを使用するとgdbが終了します.
2.ロードプログラム
方式1:直接使用コマンド:gdb実行可能ファイル、例:gdb test
方法2:gdbを使用してgdbのインタラクティブモードに入り、gdbインタラクティブモードでfile実行可能ファイル(例:file test)を使用してデバッグする実行可能ファイルをロードする
3.ソースコードのリスト
プログラムをロードした後、list(または簡略形式l)を使用すると、最初の10行のコードがリストされます.
l(またはlist)を入力すると、直後の10行のコードがリストされます.
l 3,5:3行目から5行目のコードをリストする
l 9:9行目とその上下5行目のコードをリストする
4.プログラムの実行
r(またはrun)を使用して、ロードされたプログラムを直接実行します.プログラムにブレークポイントが設定されていない場合は、プログラムは常に実行されます.プログラムにブレークポイントがある場合は、最初のブレークポイントがある場所に実行され、停止します.
5.ヘルプ機能の使用
gdbのインタラクティブモードでhelpコマンドを使用してコマンドの種類(running、stack、statusなど)をリストできます.
helpの後に種類の名前を付けると、help runningなどのプログラムの実行に関するすべてのコマンド情報がリストされます.
直接helpの後にコマンドの名前を付けて、このコマンドの紹介を取得することができます.例えば、help runはrunについての詳細な紹介を取得します.
 
ブレークポイントの設定と管理
ブレークポイントの設定デバッグ中にブレークポイントを設定します.ブレークポイントの管理には、ブレークポイント情報の表示、ブレークポイントの削除、無効化などが含まれます.
1.ブレークポイントの設定(break)
コマンドはbreak、またはbと略記されます.
b 8:8行目にブレークポイントを設定し、これを使用してrでプログラムを実行すると、8行目にプログラムが一時停止することがわかります
実行を続行する場合はcontinue(またはc)を使用して実行を続行したり、ブレークポイントに遭遇したときに一時停止したりします.
b関数名:プログラムが指定した関数に遭遇したときに実行を一時停止する
b 8 if i>7:8行目にブレークポイントを設定し、8行目のi>7が真である場合にのみ一時停止する
2.ブレークポイント情報の表示(info break)
info break:現在のgdbがデバッガで設定したすべてのブレークポイント情報を表示します.
3.指定したブレークポイントを削除(d)
dブレークポイント番号:またはdeleteを使用してブレークポイント番号を指定すると指定したブレークポイントが削除され、指定しないとすべてのブレークポイントが削除されます
4.指定した行のブレークポイントを削除(clear)
clear行番号(または範囲):指定した行のブレークポイントを削除します.
5.指定したブレークポイントを無効にする
disableブレークポイント番号:指定したブレークポイント番号は一時的に禁止され、ブレークポイント番号を指定しないとすべてのブレークポイントが禁止されます
6.指定したブレークポイントを復元する
enableブレークポイント番号:disableで禁止されているブレークポイントを再び有効にする
7.観察点の設定(watch)
プログラムのデバッグ中に、変数が変更された場所を特定する必要があることがよくあります.
観測点を使用して、変数または式の値が変化しているかどうかを検出し、変化があればプログラムの実行を一時停止します.
watch変数名(または式の名前):watch設定観察点は、プログラムの実行中に設定する必要があります.つまりrunコマンドを実行した後に設定する必要があります.
 
データ表示と変数の割り当て
ブレークポイントの適用について説明しますが、ブレークポイントのみが役に立たない場合は、プログラムの実行を追跡するには、ブレークポイントで変数の値を表示または変更できる必要があります.
以下の紹介はこのソースコードを例にとります(test.c)
#include<stdio.h>

int main()

{

    int i;

    int sum = 0;

    for(i=1; i<=10; i++)

    {

        sum += i;

    }

    printf("1+2+...+10=%d
", sum); return 0; }

1.変数または式の値(printまたはp)を表示
  1.コンパイラ(必ず-gオプションを使用):gcc-g-o test test.c
  2.gdb testを使用してデバッグするファイルをロードします(次のコマンドはgdbのインタラクティブモードで実行されます).
  3.b 8、8行目にブレークポイントを設定する
  4.r,プログラムを実行し,8行目で一時停止する
  5.p sum、このときsumの値を表示します.このときsumの値は0です.
あるいはp/x sumを用いてsumの値を16進数で出力する
  6.cコマンドを使用して実行を続行し、2回目のループは8行目で一時停止します.
  7.p sum,表示このときのsum値は1(...順次ループ)
p以降の変数はグローバル変数、またはこの役割ドメインで有効なローカル変数でなければなりません.グローバル変数とローカル変数が重複している場合、ローカル変数はグローバル変数を非表示にします.この場合、グローバル変数の値を表示するように、次の操作子を使用します.
2.変数または式の値を自動的に表示する(display)
このコマンドを使用すると、プログラムがブレークポイントで実行されるたびに、前に設定した変数や式が自動的に表示されます.
1、2、3、4は同じで、このとき実行を一時停止します
  5.display sum:自動表示sumの設定
  6.c:実行を続行し、2回目のループが8行目まで自動的に一時停止すると、p sumを使用することなくsumの値が自動的に表示されます
3.変数のデータ型を表示する(whatis、ptype)
1、2、3、4は同じで、このとき実行を一時停止します
  5.whatis sum、またはptype sumを使用すると、type=int、すなわちsumのデータ型intが表示されます.
4.変数の値の変更(set)
1、2、3、4は同じで、このとき実行を一時停止します
  5.set sum=100、このときのsumを100に設定すると、次の運転はsum=100に基づいて実行されます
  6.c,実行を継続し,2回目のループが8行目まで自動的に停止し,p sumでsumの値が101(1回目のループはsum+=i;iは1)であることがわかる.
  7.c,実行を継続し,2回目のループが8行目まで自動的に停止し,p sumでsumの値が103(1回目のループはsum+=i,iは2)であることがわかる.
 
プログラム実行と関数呼び出し
runとcontinueについて説明しましたが、他の
1.ワンステップ実行(step、next)
Stepはsと略記することができる.nextはnと略記できる
Step:関数呼び出しを実行すると、関数内部にトレースされます(呼び出された関数のエントリアドレス、行番号......)
next:関数呼び出しを実行する場所は、関数内部への追跡ではなく、直接関数呼び出しを文と見なし、過去に直接実行します.
2.呼び出された関数を終了する(return)
Stepは呼び出された関数の内部に入ることを追跡できますが、呼び出された関数を終了するにはreturnコマンドを使用します.
3.指定した行に実行(until行番号)
untilを使用するには、現在の行から指定した行の間にブレークポイントがないことを前提とします.そうしないと、最初のブレークポイントで一時停止します.
4.ジャンプ実行(jump)
通常、プログラムはプログラムコードの順に実行されますが、プログラムの実行順序を変更するにはjumpを使用します.
5.強制呼び出し関数(call)
 
その他のデバッグコマンド
1.スタック情報の表示(backtrace、frame)
 
2.ソースプログラム情報の表示(info source)
 
3.レジスタの表示(info registers)
 
4.プログラムのアセンブリコードを表示する(disassemble)