GDBのヒント(4) - ビューのパフォーマンスデータ

ビューのランタイムデータ

あなたがプログラムをデバッグする場合、プログラムが停止しているとき、あなたはprintコマンド(省略形コマンドp)を使用することができ、または同義現在のプログラムのパフォーマンスデータを表示するコマンドを調べます。フォーマット印刷コマンドは次のとおりです。

  • <exprの>印刷
  • 印刷/ <F> <exprの>

    <exprは>、表現である我々は表現の16進数に応じた出力をフォーマットしたい場合は、<F>例えば、出力フォーマットである、(GDBは、プログラミング言語の多様性をデバッグすることができます)あなたがプログラムをデバッグしている言語の表現であります、それは/ Xです。

まず、表現

    あなたが表現を受け入れることができ、同様に印刷し、多くのGDBコマンド、GDBは、それが表現であるから、それはconstの定電流のプログラム実行中、変数、関数、などすることができ、実行中の現在のプログラムの発現データに基づいて計算されますコンテンツ。残念ながら、GDBは、プログラムで定義されたマクロを使用することはできません。
   
この記事の例では、C / C ++にあるように、C / C ++は、言語の人気のタイプですので、式の構文は、現在デバッグ中の言語の文法でなければなりません。(GDB使用されている他の言語のデバッグの章では、私は後で説明します)

式では、GDBは、彼らがどの言語でも使用することができ、いくつかの演算子をサポートしています。

  • @

    関連する演算子と配列され、後に詳細に説明します。
   

  • ::

    ファイルまたは変数の関数を指定します。
   

  • {<タイプ>} <ADDR>

    これは、オブジェクト型の種類にメモリアドレス<ADDR>点を表します。

 

第二に、プログラム変数

:GDBでは、いつでも次の三つの変数の値を確認することができます
    (目に見えるすべてのファイル)1、グローバル変数
    2、静的なグローバル変数(現在のファイルが見えている)
    3、(可視現在のスコープ)のローカル変数を
   
    ローカルの場合そして、(同じ名前である)グローバル変数の競合は、一般的には、ローカル変数の皮機能における現在の停止位置ならば、グローバル変数と同じ名前のローカル変数の関数であれば、言うことですグローバル変数であり、バリアブルプリントが示す値は、関数内のローカル変数になります。あなたはグローバル変数の値を表示したい場合は、この時点で、あなたは「::」演算子を使用することができます。

  • ファイル::変数
  • 機能::変数

あなたはこのフォーム、文書またはその機能を確認したい変数を指定することができます。例えば、xの値でグローバル変数f2.cファイルを表示するには:

  • GDB)P 'f2.c' :: X

もちろん、「::」オペレータが競合してC ++になり、GDBは自動的に識別することができ、「::」C ++プログラムをデバッグするときに異常心配する必要はありませんので、C ++の演算子です。
   
    また、あなたはコンパイラの最適化オプションをオンにした場合、最適化プログラムは、いくつかの変数にアクセスすることができない場合や、誤ったコードの値を発生することときにGDBでデバッグしていることに注意してください。オプティマイザは無意味な変数を除く、あなたのプログラムを切除あなたの文のシーケンスプログラムを開催しますので、これは、正常であり、GDBデバッガ、コマンドの実行中に、このプログラムので、あなたは、命令を書かれています同じではない、それはあなたが想像できない結果になります。ときにプログラムをコンパイルするときに、この状況に対処が近いコンパイラの最適化に必要です。一般的には、ほぼすべてのコンパイラは、例えば、GNUのC / C ++コンパイラGCCコンパイラを最適化スイッチをサポートし、あなたがこの問題を解決するための「-gstabs」オプションを使用することができます。コンパイラのパラメータについては、コンパイラのマニュアルを参照してください。
   

第三に、配列

  時には、あなたは連続したメモリ空間の値を参照する必要があります。そのような配列の断片、または動的に割り当てられたデータのサイズとして。あなたはGDBを使用することができ、「@」演算子は、左の「@」右「@」のメモリアドレスの最初の値であるあなたは、メモリの長さを見たいです。例えば、あなたのプログラムは、この声明があります。

  •     INT *配列=(INT *)はmalloc(LEN *はsizeof(INT))。

   このように、GDBデバッグプロセスでは、次のコマンドを使用して、この動的配列の値を表示することができます。

  •     LEN @ P *の配列

これは同様に左@変数配列は、コンテンツを指摘している配列の最初のアドレスの値であり、右が変数LENに格納されたデータの長さであり、出力結果は、約見えます。

  •     (GDB)は、p *配列@ LEN
  •     $ 1 = {2、4、6、8、10、12、14、16、18、20、22、24、26、28、30、32、34、36、38、40}

それは静的な配列である場合は、直接配列の名前を印刷することができ、あなたは、アレイ内のすべてのデータの内容を表示することができます。

   
第四に、出力形式

    一般的に、変数の種類に応じて、GDB意志出力変数値。しかし、あなたはまた、フォーマットGDBの出力をカスタマイズすることができます。たとえば、あなたはビットの場合には、これを見るために、出力Aの16進整数、またはバイナリ整数変数にしたいです。これを行うには、GDBのデータ表示形式を使用することができます。

16進形式のXディスプレイ変数。
変数の10進形式を示してdが。
Uは、16進形式の符号なし整数を示します。
O進可変表示形式。
バイナリ形式で変数tを表示します。
16進形式で表示する変数。
文字形式としてC表示変数。
浮動小数点形式で押し表示変数f。

    (GDB)PI
    $ 21 = 101   
   
    (GDB)P / Al
    = 0x65 $ 22
   
    (GDB)P / CI
    $ = 23 101 'E'
   
    (GDB)P / FI
    $ = 24 1.41531145e-43
   
    (GDB)P / XI
    $ 25 = 0x65
   
    ( GDB)のp / TI
    $ = 26 1100101


第五に、表示メモリ

あなたは、メモリアドレスの値を参照してください(ある略しx)のコマンドを調べることができます。次のようにXコマンドの構文は次のとおりです。

  • X / <N / F / U> <ADDR>

N、F、Uはオプションのパラメータです。

  • nは表示メモリ、後方いくつかのアドレスから現在のアドレスを言うことで、表示内容の長さを表す正の整数です。
  • fは形式を表し、上記を参照されたいです。アドレス文字列が参照されている場合は、フォーマットは、命令アドレスが10であれば、そのフォーマットは私であってもよいし、sのかもしれません。
  • uが指定されていない場合、GDBのデフォルトは4バイトであり、次のアドレス要求からのバイトの数を表します。Uは、以下のパラメータによって代わりに文字を使用することができ、bは1バイトを表し、Hは、2つのバイトを表し、wはGが8つのバイトを表し、4つのバイトを表します。我々はバイト長を指定すると、GDBは、メモリ手段から開始します指定されたバイトを読み書き、メモリアドレスを指定し、その値はとして取り出されます。
  • <ADDR>は、メモリアドレスを表します。

N / F / U 3つのパラメータを併用してもよいです。例えば:

コマンド:X / 3uh 0x54320前記メモリアドレス0x54320からコンテンツを読み取り、Hは、Uは16進表示を示し、ダブルバイト単位が、3は3つのユニットです。

   
第六に、自動表示

あなたは、プログラムが停止したときに、いくつかの変数が自動的に表示されて設定することができ、またはあなたがステップスルーする場合、これらの変数が自動的に表示されます。GDBコマンドは、表示を関連付けられています。

  • ディスプレイ<exprの>
  • ディスプレイ/ <FMT> <exprの>
  • ディスプレイ/ <FMT> <addrの>

exprの表現、FMT表現形式の表示、あなたがいる限り、あなたのプログラムが停止しているように、一の以上の式で表示を設定し、GDBが自動的にあなたにこれらの設定が表示されますときaddrは、メモリアドレスを示しています式の値。

IとSフォーマットでも表示をサポートしている、非常に便利なコマンドは次のとおりです。

  • ディスプレイ/私はPCを$

$ Pcは命令のアドレスを示すGDB環境変数は、/ iが組み立てられる機械コード命令の出力形式を示しています。プログラムが停止したのでとき、状況はに対応するソースコードとマシンコードの指示になります、これは非常に興味深い機能です。

ここでは、関連するGDBコマンドとディスプレイの一部は以下のとおりです。

、いったん<dnums ...>
[削除]を実行します表示<dnums ...>
自動車ショー、dnums手段自動明示的な数字のセットアップを削除します。同時に複数を削除するには、番号は、スペースで区切ることができますが、範囲内の数字はマイナス記号で表現することができます削除したい場合(例:2-5)

ディスプレイ無効<dnums ...>実行
ファイル名を指定して実行を有効に表示<dnums ...>
オートショーを設定していない無効化、削除enalbeを、単にそれが失敗し、回復しましょう。

インフォメーションディスプレイ
表示設定情報を表示するには、自動的に表示されます。GDBは、当然のことながら、テーブルを再生します番号、表現の設定を含むどのように多くの自動設定を示すかどうか、有効にするために、あなたのレポートを設定試運転します。


七、設定の表示オプション

GDBのより多くのディスプレイ上のオプション、そしてここで私は、最も一般的に使用されるオプションを述べました。

  • 設定された印刷アドレス
  • 上の設定された印刷アドレス

    アドレス出力、機能を表示するプログラム情報を開き、GDBは関数パラメータのアドレスが表示されます。:システムのデフォルトは、次のような、オープンである
   
    F(GDB)
    #0 set_quotes(LQ = 0x34c78 "<<"、RQ = 0x34c88 ">>")
        530:input.c AT
    530 IF(Lquote = def_lquote!)


オフセット印刷アドレス
    などのパラメータアドレス表示機能をオフ、:
   
    (GDB)ADDR SET OFF印刷
    (GDB)F
    530:AT input.cに#0 set_quotes(LQ = "<<"、RQを= ">>")
    530 IF (lquote!= def_lquote)

  • ショーの印刷アドレス

    表示オプションの現在のアドレスを表示して開いています。
   

  • セット印刷配列
  • 上のセットのプリントアレー

    それが開かない場合、アレイは、表示中の開いているとき、ディスプレイアレイを開き、各要素に対して1つの列は、各要素はコンマで区切られています。このオプションはデフォルトではオフになっています。以下の2つのコマンドに関連付けられて、私はここでそれらを繰り返すことはしません。

  • セット印刷アレイオフ
  • ショーの印刷配列
  • 設定された印刷要素<数の要素>

    このオプションは、主に、あなたの配列が大きすぎる場合、あなたは、データの最大長は、表示指定するには、<要素数>を指定することはできません、それはこの長さに達したときに、GDBは、もはや上下に表示され、配列に設定されています。0に設定すると、それは無制限を意味します。
   

  • 印刷要素を示し、

    表示オプションは、情報の要素を印刷します。
   

  • セット印刷ヌル・ストップ<オン/オフ>

    このオプションがオープンしている場合は、表示文字列に遭遇ターミネータはショーを停止したとき。オフにこのオプションがデフォルトです。
   

  • かなり上のセットの印刷

    開くのprintfかなりこのオプション場合GDBは構造が表示されたときに、より美しくなります。以下のような:

        $ 1 = {
          次= 0x0の、
          フラグ= {
            甘い= 1、
            酸味= 1
          }、
          肉=が0x54 "豚"
        }

  • かなりオフセット印刷

    非常に近いこのオプションのprintf、GDBは、構造を以下に示す表示されます
   
        。{。。次に、フラグ=スウィート1 = {、} 1 =酸味、肉=が0x54 "豚"} $ 1 = 0x0の=
       

  • きれいな印刷を示して

    GDBは、ディスプレイ構造を表示する方法です。
   

  • セット印刷sevenbit-文字列<オン/オフ>

    例えば、「/ 065.」として、どうか「/ NNN」の表示形式、開いている場合、または/ NNN表示で文字列データによって、文字表示の設定

  • 印刷sevenbit-文字列を表示します

    表示文字の表示がオンになっています。
   

  • セット印刷組合<オン/オフ>

    構造表示を設けた場合、ジョイントデータそこに明示的かどうか。例えば、次のようなデータ構造:
   
    typedefを列挙{ツリー、バグ}種;
    typedefを列挙{Big_tree、ドングリ、苗} Tree_formsを;
    typedefを列挙{キャタピラー、繭、バタフライ}
                  Bug_forms、
   
    構造体シング{
      種IT;
      ユニオン{
        Tree_formsツリー;
        Bug_formsバグ;
      }フォーム;
    };
   

  •     構造体事FOO = {ツリー、ドングリ{}};

    スイッチを開くと、以下のように、P fooというコマンドを実行した後に、表示されます
        。$ 1 = {ITツリー、フォーム= {ツリー=ドングリ、バグ=繭} =}
   
    以下に示すように、スイッチは、P FOOコマンドの実行後に無効になっています:$
        = {。ITは、ツリー= 1、フォーム= {...}}

  • ショーの印刷組合

    チェックデータの連邦が表示されます
   

  • セット印刷オブジェクト<オン/オフ>

    オブジェクトは、その派生クラスへのポインタである場合は、このオプションを開いた場合は、仮想関数テーブルの問題について、そして、GDBをこのオプションをオフにした場合C ++では、仮想メソッドの規則に従って自動的にGDBは、ディスプレイ出力を呼び出します。オフにこのオプションがデフォルトです。

  • ショーの印刷オブジェクト

    ビューの設定は、オプションのオブジェクト。
   

  • セット印刷静的メンバー<オン/オフ>

    C ++オブジェクトの表示内容は、その中に静的データメンバを表示するかどうか、である、このオプションの手段。デフォルトはオンです。

  • ショープリント静的メンバー

    静的データメンバのオプション設定を表示します。
   

  • セット印刷VTBL <オン/オフ>

    このオプションをオンにすると、仮想関数テーブルを表示するとき、GDBは、より多くの構造形式を使用します。これはデフォルトでオフになっています。
   

  • ショーの印刷VTBL

    仮想関数の表示形式オプションを表示します。

 

八、歴史

    あなたはGDBの印刷プログラムが実行されているとのデータを表示すると、あなたはGDBになりますすべての印刷を記録しました。GDBは$ 1、$ 2、$ 3 .....あなたは数に各コードのためのコマンドを印刷するようになります。だから、あなたは、$ 1としては、前の式にアクセスするには、この番号を使用することができます。この機能の利点は、あなたが以前に長い式を入力した場合は、式の値を確認したい場合は、あなたが再入力する必要がなくなり、アクセス履歴を使用できることですもたらします。

 

九、GDBの環境変数

あなたは、環境、一部のデバッグプログラムを保存するために使用するオペレーティングデータをデバッグGDBに独自の変数を定義することができます。GDBはちょうど非常に簡単です変数を定義します。GDBコマンドセットを使用してください。GDBとUNIX環境変数、ちょうど$で始まるように。以下のような:

  • セット$ fooの= * object_ptr

環境変数を使用している場合、GDBは、ときに最初に使用し、使用後に、直接彼らの割り当てに変数を作成します。環境変数を使用すると、特定の環境変数のいずれかのタイプを定義することができ、入力しないでください。構造と配列を含んでいます。

  • ショーの利便性

    現在設定されているすべての環境変数を表示するためのコマンド。
   
これは、デバッグプログラムをより柔軟かつ便利になり、より強力な、インタラクティブな使用環境変数とプログラム変数です。例えば:

  •     セット$ I = 0
  •     印刷バー[$ I ++] - >内容

次に、あなたがいないときは、印刷バー[0] - >コンテンツ、プリントバー[1] - > [コマンド入力の内容。このコマンドを入力した後、唯一のノックアウトラウンド、前のステートメントを繰り返し機能を完了するために、一つの出力により、環境変数が自動的にインクリメントされ、実行されます。

 

テン、ビューを登録します

 

レジスタの値を表示するには、非常にシンプルな、次のコマンドを使用できます。

  • 情報登録

    表示レジスタ状況。(浮動小数点レジスタを除きます)

  • 情報すべてのレジスタ

    すべてのレジスタの表示。(浮動小数点レジスタを含みます)

  • 情報レジスタ<説明regname ...>

    レジスタ指定の状況を表示します。
   
    こうした現在のスタックアドレス命令アドレス(IP)プログラム、現在実行中のプログラム(SP)などのようなときに、プログラムが実行されると、データを配置すると、登録します。ケースは、あなたもそれにレジスタ名の前に$記号を追加し、レジスタにアクセスするには、printコマンドを使用することができます。以下のような:P $ EIP。

 

オリジナル住所:https://blog.csdn.net/haoel/article/details/2883

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

おすすめ

転載: blog.csdn.net/li_wen01/article/details/105223945
おすすめ