GDBのヒント(2) - GDBコマンド

DBの概要コマンド

次のようにgdbを起動した後、あなたはGDBデバッグ環境にもたらされるだろう、あなたが起動するgdbデバッガコマンドを使用することができ、GDBのコマンドは、ビューにhelpコマンドを使用することができます。

/home/hchen> gdb
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-suse-linux".
(gdb) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help" followed by command name for full documentation.
Command name abbreviations are allowed if unambiguous.
(gdb)

GDBは、GDBはカテゴリの数に入れて、たくさんのコマンドhelpコマンドGDBのコマンドタイプ以外は実施例、およびコマンドはタイプ、缶のヘルプ<クラス>コマンドに依存している場合、例えば:ヘルプのブレークポイントは、設定されたブレークポイントにすべてのコマンド。あなたはまた、直接helpコマンドを表示する<コマンド>を助けることができます。


GDB、入力コマンド、あなたはもちろん、コマンドの最初の数文字は、Linuxでのユニークなコマンドでマークする必要があり、それを再生するには、コマンドの最初の数文字だけをコマンド全体を再生することはできません、あなたがノックすることができますパッドに二回のコマンドの完全な名前をTABキーを押し、そこに反復される場合には、GDBはその例で出てきます。
   
例1:関数funcを入ると、ブレークポイントを設定します。あなたはブレークfuncをノック、または直接B FUNCであることができます

  • (GDB)のB FUNC
  • 0x8048458でのブレークポイント1:ファイルのhello.c、ライン10。

例二:あなたは、Bコマンドを使用しているすべての始まりが表示されます、TABキーを2回押してbをノック:

  • (GDB)B
  • バックトレースブレークBT
  • (GDB)

例3:ちょうどプレフィックス機能を覚えて、それはすることができます。

  • (GDB)B make_ <按TAB键>
  • (もう一度あなたが表示されます、TABキーを押してください:)
  • make_a_section_from_file make_environ
  • make_abs_sectionのmake_function_type
  • make_blockvectorのmake_pointer_type
  • make_cleanup make_reference_type
  • make_command make_symbol_completion_list
  • (GDB)のB make_

あなたが見るすべてのケースを作るために始めるGDBすべての機能。

例4:C ++プログラムをデバッグするとき、あなたは同じ関数名を持つことができます。以下のような:

  • (GDB)B「バブル(M-?
  • バブル(ダブル、ダブル)バブル(int型、int型)
  • (GDB)B「バブル(

あなたは、C ++でオーバーロード関数とパラメータのすべてを表示することができます。(注:M-と「押し二回Tabキーは」意味ですか?)

短い髪が終了するか、ライン上のqコマンドだけのために、GDBを終了します。

GDBでプログラムを実行します。

GDBを起動するには、<プログラム>の方法をgdbをするときに、GDBはカレントディレクトリとパスPATH <プログラム>のソースファイルを検索します。GDB読み出しソースファイル、またはlistコマンドLを確認するために、ソースコードが表示されている場合、GDBエネルギーを見るために使用することができます。

GDBでは、Rまたはrunコマンドを使用してプログラムを実行します。プログラムを実行し、あなたは問題の次の4つの側面を設定する必要があるかもしれません。

1、プログラムの動作パラメータ。
    ランタイムを指定するパラメータ引数のセット。(例:SET 20 30個の40 50 10引数である)は、
    引数が良好なビュー動作パラメータを設定するためのコマンドを表示します。

2、動作環境。
    パス<DIR>パスは、プログラムを実行するように設定することができます。
    プログラムの走行経路を表示するパスを示しています。
    セット環境VARNAME [=値]設定した環境変数。以下のような:SETはUSER = hchen envの
    環境変数を表示する表示環境[VARNAME]を。

3、作業ディレクトリ。
    CDシェルに対応する<DIR> cdコマンド。
    pwd現在のディレクトリ。

図4に示すように、入出力プログラム。
    あなたのターミナルプログラムを使用するための情報端末表示モード。
    制御プログラム出力のリダイレクト。以下のような:RUN> OUTFILE
    TTYコマンド入力端子と出力端子のいずれかの書き込みに。以下のような:TTYは/ dev / ttybを

デバッガがすでに実行されています

二つの方法:
1、<プログラム> PID形式は実行中のプログラムをマウントGDBを使用し、その後UNIX PID(プロセスID)の下にPSで実行中のプログラムを見て、と。
図2は、最初に関連付けられたソースコード上のGDB <プログラム>、およびGDB、GDBとプロセスのPIDをマウントするコマンドを取り付けます。そして、デタッチとアンマウント処理します。

一時停止/再開ランニング

プログラムを停止するには、デバッガは、GDBは、簡単にプログラムの動作を停止することができ、必見です。あなたは、ラインが停止したプログラムを設定し、条件が停止して何の下で、一度というように任意の信号を受信するように停止することができます。ですから、実行時の変数だけでなく、プロセスの実行を参照してくださいということ。

プロセスは、GDBを停止しているときに、あなたがプログラムは、プロセスIDを実行しているかどうかを確認するには、infoプログラムを使用することができ、その理由は中断されています。

ブレークポイント(中断点)、観測点(ウォッチポイント)、捕捉点(キャッチポイント)、信号(シグナル)、停止するスレッド(停止スレッド):GDBでは、方法以下のポーズを有することができます。あなたは回復プログラムを実行する場合、またはあなたは、cコマンドを使用し続けることができます。

まず、ブレークポイントを設定するブレークポイント等

私たちは、ブレークポイントを設定するには、breakコマンドを使用します。セットブレークポイントには、いくつかの正の方法があります。

  • ブレーク<機能>

    停止指定された関数を入力します。C ++関数名はクラス::関数または関数(タイプ、種類)フォーマットを使用して指定することができます。

  • ブレーク<LINENUM>

    指定された行番号で停止。

  • 休憩+オフセット
  • ブレーク-offset

    前に、またはオフセット現在行の行番号の後ろに停止しました。offisetは自然数です。

  • ファイル名を破る:LINENUM

    LINENUMは、ソースファイルのファイル名の行で停止しました。

  • ブレークファイル名:機能

    ソースファイルのファイル名機能関数の入り口で停止。

  • ブレーク*アドレス

    プログラムを実行するためのメモリ内のアドレスが停止しました。

  • ブレーク

    breakコマンドは、パラメータはありません場合は、次の命令で停止を示しています。

  • 休憩...もし、<条件>

    ...上記のパラメータであってもよく、条件は、条件が満たされたときに状態が停止表します。私は100 =たとえば、サイクル環境本体に、切れ目を設けることができる、私は、プログラムが停止されたときに100で示しています。

)nがブレークポイントを示している。使用することができるブレークポイント情報コマンドを表示するとき、として:(注以下

  • インフォブレークポイント[N]
  • インフォブレイク[N]

観測点(ウォッチポイント)設定された第2、

一般的な観測点式(可変式)の値は変化があるかどうかを確認するために、変更があった場合、直ちにプログラムが停止しました。私たちは、観測点を設定するには、次のいくつかの方法があります。

  • <exprの>見ます

    観測点exprの式(変数)を設定します。発現量の値の変化があった場合は、すぐにプログラムを停止しました。
   

  • rwatch <exprの>

    式(変数)式exprが読み込まれると、プログラムが停止しました。
   

  • awatch <exprの>

    式(変数)の値を読み書きする場合には、プログラムを停止します。

  • 情報ウォッチポイント

    現在設定されているすべての観測点の一覧を表示します。

第三に、設定キャプチャポイント(キャッチポイント)

あなたは、プログラムの実行時にイベントの一部をキャッチアップするためにキャプチャポイントを設定することができます。例えば:負荷共有ライブラリ(DLL)またはC ++例外。セットのスナップ小数点フォーマット:

キャッチ<イベント>
    イベントが発生すると、プログラムが停止しました。:イベントには、次の内容を持つことができます
    1、スローされたC ++例外をスローします。(キーワードとして投げ)
    C ++の例外をキャッチするために、2キャッチ。(キーワードとしてキャッチ)
    3、のexec execシステムコールの時間。(キーワードのExecの本は、この機能は、HPの下に-UXのみ動作します)
    4、ときforkシステムコールフォーク。(フォークキーワードに、本のために、この機能はHPの下だけで-UX動作します)
    5、のvforkシステムコールのvforkを呼び出します。(のvforkキーワードに、本のために、この機能はHPの下だけで-UX動作します)
    6、ロードまたはロード<libnameに>負荷共有ライブラリ(DLL)。(キーワードの負荷、現在、この機能は、HPの下に-UXのみ動作)
    アンロード7、アンロードまたはアンロード<libnameを>共有ライブラリ(DLL)。(キーワードのアンロードは、この機能は、HP-UX、現在のみ有効です)

tcatchは、<イベント>
    のセットポイントを一度だけ撮影し、停止したプログラムは、ポイントが自動的に削除されなければなりません。

第四に、メンテナンスの停止点

これは、ポイントは、GDBにおける上記3つの駅です、停止点にプログラムを設定する方法を述べています。GDBでは、あなたは良い停止点は何の使用を定義されていないと感じた場合、あなたは保守を行うために、これらのコマンドを有効にする、削除、クリア、無効化を使用することができます。

  • 晴れ

すべての停止ポイントをクリアして定義されています。

  • 明確な<機能>
  • 明確な<ファイル名:機能>

機能上の点を停止し、すべての設定をクリアします。

  • 明確な<LINENUM>
  • 明確な<ファイル名:LINENUM>

ライン上の停止位置を指定したすべての設定をクリアします。

  • 削除[ブレークポイント] [範囲...]

指定されたブレークポイント、ブレークポイントブレークポイント番号を削除します。あなたはブレークポイント番号を指定しない場合、すべてのブレークポイントを削除します。(:3-7など)の範囲の数は、ブレークポイントの範囲を示しています。その省略形のコマンドは、D。


より良い削除よりも一つの方法は、あなたが、することができごみ箱の場合と同じように有効にする必要がある場合、GDBは削除されません無効に停止点、無効停止点です。

  • 無効化[ブレークポイント] [範囲...]

停止は、指定されたポイント、ブレークポイントの停止ポイント数を無効にします。何も指定されていない場合は、すべての停止ポイントを無効にします。略称コマンドはDISです。

  • 有効[ブレークポイント] [範囲...]

停止指定されたポイントを有効にすると、ブレークポイントは、ポイント数を停止します。

  • レンジ一度[ブレークポイント]を有効にします...

プログラムが停止したとき、指定された停止ポイントを有効にする、停止点のすぐGDBは自動的に無効。

  • [ブレークポイント]削除範囲を有効に...

プログラムが停止したときに、GDB停止ポイントはすぐに自動的に削除、一度指定された停止ポイントを有効にします。

第五に、停止条件の整備

フロントには、ブレークポイントを設定することに来るとき、私たちはあなたが条件が満たされたときに、プログラムが自動的に停止条件を設定することができることを言及し、これは非常に強力な機能ですが、ここでは、私はこの特に関連する保全指図条件についてお話したいと思います。私たちは、キーワードを使用する場合、一般的には、ブレークポイントの条件を設定するために、そのブレーク条件が続きます。そして、設定した条件の後、我々は条件条件付きブレークポイントを変更するためにコマンドを使用することができます。(キャッチは現在サポートされていない場合は、場合にのみコマンドのサポートを破ると見ます)

  • 条件<bNumを> <式>

    発現させるためのブレークポイント番号bNumを停止条件を変更します。

  • 条件<bNumを>

    ブレークポイントをクリア数bNumを停止条件。


あなたが停止条件を数回を無視して、実行するプログラムを指定することができ、むしろ特別なメンテナンス・コマンドは無視もあります。

  • <bNumを> <回数>無視

    ブレークポイント番号bNumを停止条件カウント時間を無視することを意味します。

第六は、停止点にRunコマンドを設定します

私たちは、runコマンドを提供停止点を設定するには、GDBのコマンドのコマンドを使用することができます。プログラムが実行を停止したときである。つまり、とき、ライブ、我々はそれが自動的に自動化されたデバッグの非常に有益なラインをある他のいくつかのコマンドを実行してみましょうことができます。GDBベースのデバッグの自動化は、強力なサポートです。

  • コマンド[bNumを]
  • ...コマンドリスト...
  • 終わり

ブレークポイント番号bNumをいずれかのコマンドのリストを書きます。プログラムがブレークポイントを停止すると、gdbがリストアップして、コマンドの実行]をクリックしますします。

例えば:

  •     X> 0の場合FOOを破ります
  •     コマンド
  •     printfの "Xは%D / N"、X
  •     継続する
  •     終わり

    関数fooブレークポイントは、xの値が関数foo 0よりも大きくなると、プログラムは、ライブ、すなわちにオフである場合、X> 0、ブレークポイントを設定され、GDBが自動的にxの値を出力し、プログラムを継続します。

あなたは、ブレークポイントで一連のコマンドをクリアしたい場合は、単にコマンドで次のコマンドを実行し、ライン上の直撃を終了。

七ブレークポイントメニュー

C ++では、それは関数名(関数のオーバーロード)で数回繰り返してもよい、この場合には、ブレーク<機能>はその機能の入り口に停止するようGDBを伝えることはできません。もちろん、あなたがブレーク<機能(タイプ)>使用できる関数パラメータの型が関数を指定し、GDBを伝えています。それ以外の場合、GDBのブレークポイントメニューはあなたが必要なブレークポイントを選択するためのリストが表示されます。あなたはそれの数字のあなたのメニューリストを入力します。以下のような:

(GDB)文字列B ::後
[0]キャンセル
[1]すべて
[2]ファイル:String.cc。行番号:867
[3]ファイル:String.cc。行番号:860
[4]ファイル:String.cc。行番号:875
[5]ファイル:String.cc。行番号:853
[6]ファイル:String.cc。行番号:846
[7]ファイル:String.cc。行番号:735
> 2 4 6
ブレークポイント1 0xb26cで:ファイルString.cc、ライン867
ファイルString.cc、行875:0xb344でブレークポイント2
0xafccでブレークポイント3:ファイルString.cc、ライン846
複数のブレークポイントましたセットする。
不要な削除する「削除」コマンドを使用して
 ブレークポイントを。
(GDB)

目に見える、GDBリストは、すべてのオーバーロード関数の後、あなたは、リスト上の番号のリストを見るために選択することができます。設定されたブレークポイントに0放棄は、1が全ての機能がセットブレークポイントであることを示しています。

八、経由回復プログラムステップを実行します

プログラムが停止しているときは、プログラムの終了、または次のブレークポイントの到着まで、プログラムを実行するために、restoreコマンドを続行することができます。また、コマンド次のステップまたはシングルステップ追跡プログラムを使用することができます。

  • 引き続き[無視カウントを]
  • C [無視カウント]
  • FG [無視カウント]

    Recoveryプログラムは、プログラムの終了、または次のブレークポイントの到着まで実行されます。無視カウントブレークポイントは、その後無視された回数を表します。引き続き、C、FG 3つのコマンドが同じ意味です。

  • ステップ<回数>

        シングルステップの追跡関数呼び出しがある場合、彼は関数を入力します。この機能は、デバッグ情報をコンパイルされていることを前提に機能。VCや他のツールのステップのように。Countは、物品の実装を見せず、カウント命令はバックを示す追加行い、その後、停止、なくて後から追加することができます。

  • 次の<数>

    同じシングルステップの追跡関数呼び出しがある場合、彼は関数を入力しません。VCや他のツールと同様にステップオーバー。Countは、物品の実装を見せず、カウント命令はバックを示す追加行い、その後、停止、なくて後から追加することができます。

  • セットステップ・モード
  • 上のセットステップ・モード

    オープンモードステップ・モード、そして、ワンステップトレースで、プログラムは、no debug情報ので、停止しません。パラメータは、マシンコードを読み取ることは非常に困難です。

  • 設定ステップ-MODオフ

    閉じるステップモードモード。

  • 仕上がり

    現在の関数の戻りが完了するまでプログラムを実行します。そして、印刷機能スタックの戻りアドレスと戻り情報値と引数の値。

  • またはuまで

    あなたはシングルステップトラッキングループ本体の間に疲れたとき、あなたがループを終了するまで、このコマンドは、プログラムを実行することができます。

  • 工程1またはSi
  • nexti 或 ni

        シングルステップマシン命令を追跡!プログラムコードは、マシン命令の数、工程1のnextiによって完成することができ、機械語命令をステップすることができます。コマンドと同じ機能を持っている機械命令プログラムコード(すなわち、アセンブリコード)を再生中にこのコマンドを実行した後、ステップトレースが再生されます場合は、「表示/私はPCを$」

ナイン、信号(シグナル)

信号は、ソフトウェア割り込みである非同期イベントを処理する方法です。一般的には、オペレーティングシステムには、多くの信号をサポートしています。特にUNIXでは、より多くの重要なアプリケーション・プロセスは、通常、信号。SIGCHLDは、子プロセスの状態変化信号を表す;プログラムの終了を示すSIGKILL信号が実行され、そのためにUNIXにCtrl + C、SIGBUSハードウェア障害が発生した信号を示す信号であるブレーク・キャラクタを表すようSIGINT信号として、信号の数を定義します。セマフォは、UNIXの下で非常に重要なプログラミング技術です。

GDBは、あなたがプログラムをデバッグするとき、信号のいずれかの種類を扱うことができる、あなたはどのような種類の信号処理GDBのニーズを伝えることができます。あなたは、デバッグのために、すぐにプログラムの実行を停止し、GDBは、指定した受信信号を求めることができます。あなたはこの機能を完了するために、ハンドルGDBコマンドを使用することができます。

  •     ハンドル<信号> <キーワード...>

        GDBで定義された信号処理。信号<信号>が開始しないか、SIG SIG、処理すべき信号によって定義することができる範囲で開始することができる(例:SIGIO-SIGKILL、それはSIGIO、SIGIOT、三つの信号を含む信号SIGIO SIGKILLからの処理信号を示しSIGKILL )、あなたはまた、処理される信号のすべてを示すために、すべてのキーワードを使用することができます。プログラムデバッグ中の信号が受信されると、GDBを実行しているプログラムは、デバッグのために、すぐに停止されます。これは、<キーワード>次のキーワードの1以上であってもよいです。

  • NOSTOP

    プログラムは、受信した信号をデバッグしているときに、GDBはプログラムの実行を停止しませんが、あなたがそのような信号を受信するように指示するメッセージを再生します。

  • やめる

    プログラムは、受信した信号をデバッグしているときに、GDBはプログラムを停止します。

  • プリント

    プログラムは、受信信号をデバッグ中の場合、GDBはメッセージを表示します。

  • NOPRINT

    プログラムは、受信した信号をデバッグしているときに、GDBは、情報信号を受信教えてくれません。

  • パス
  • NOIGNORE

    プログラムは、受信した信号をデバッグしているときに、GDBは、信号を処理しません。この手段は、GDBデバッガハンドルへの信号になる、ということ。

  • NOPASS
  • 無視します

     プログラムが受信された信号をデバッグ中の場合、GDBは、デバッガが信号を処理することはできません。

 

  • 情報信号
  • 情報ハンドル

     GDBで検出された信号を参照してください。


X.スレッド(スレッド停止)

アプリケーションがマルチスレッドである場合は、すべてのスレッドかどうかに、または特定のスレッドにブレークポイントを定義することができます。GDBは、簡単にあなたがこの作業を完了することができます。

  • ブレーク<関数LineSpec>スレッド<threadno>
  • 場合は、<関数LineSpec>スレッド<threadno>破ります...

        ソースプログラムにブレークポイントを設定する行番号を指定して関数LineSpec。threadno指定されたスレッドID、このIDは、GDBに割り当てられていることに注意してください、あなたがプログラムを介して「情報スレッド」コマンドを実行しているスレッドに関する情報を表示することができます。あなたがスレッドを指定しない場合、<threadno>上記のすべてのあなたのブレークポイントのスレッドを示します。また、スレッドのブレーク条件を指定することができます。以下のような:
   

  • (GDB)ブレークfrik.c:13スレッド28 bartab> LIM場合

あなたのプログラムがGDBを停止すると、実行中のすべてのスレッドが停止されます。これはあなたの全体的な実行中のプログラムを表示することができ容易にします。あなたは回復プログラムを実行したときと、すべてのスレッドが再開されます。シートをデバッグしても、メインプロセスステップ。

 

 

 

公開された175元の記事 ウォンの賞賛262 ビュー700 000 +

おすすめ

転載: blog.csdn.net/li_wen01/article/details/105222041