GDBのヒント(3) - ビュースタック情報

ビュースタック情報

プログラムが停止しているときは、最初にやるべきことは、プログラムが固定されている場所を確認することです。あなたのプログラムは、関数、関数のアドレス、関数のパラメータを呼び出すと、関数内のローカル変数は、「スタック」(スタック)に押し込まれるインチ あなたは、現在のスタックに関する情報を表示するGDBコマンドを使用することができます。

ここではいくつかの視聴機能、コールスタック情報GDBコマンドは、次のとおりです。

  • バックトレース
  • BT

    現在の関数呼び出しスタックに関するすべての情報を印刷します。以下のような:

  •     (Gdbの)BT
  •     tst.cで#0 FUNC(N = 250):6
  •     30:tst.cで主に#1 0x08048524(ARGC = 1、ARGV = 0xbffff674)
  •     /lib/libc.so.6から__libc_start_mainに0x400409ed#2() 

    機能コールスタック情報から見ることができます:__ libc_start_main - >)(メイン - > FUNC()
   

  • バックトレース<N>
  • BT <N>

    nは正の整数、スタックのみn層スタック上の印刷情報です。

  • バックトレース<-n>
  • BT <-n>

    表-n正の整数スタック情報のみn層スタックの下に印刷されています。
       
プログラムが停止したときに、下地層スタックの詳細を表示したい場合は、情報の一定のレベルを確認したい場合は、現在のスタックを切り替える必要があり、一般的には、スタックの最上位には、現在のスタックされているを最初に行うこと現在のスタックを切り替えます。

  • フレーム<N>
  • F <n>は

    nは0の整数であり、スタックの層の数です。例えば:フレーム0、スタック、フレーム1の第2の層スタックを示しています。

  • アップ<N>

    これは、n型層の上のスタックの動きを表し、nは再生されない場合があり、上向きに1層の移動を表します。
   

  • ダウン<N>

    下位n層スタックへの移動を表し、nは下方に移動層を再生できない場合があります。
   

上記のコマンドは、情報層がスタックに移動してプリントアウトします。あなたはそれが情報を遊ばせたくない場合。あなたはこれらの3つのコマンドを使用することができます。

  •     選択フレームを<N>コマンドは、フレームに対応します。
  •     サイレントアップ<N> UPコマンドに対応しています。
  •     サイレントダウン<N> DOWNコマンドに対応しています。

層の現在のスタックに関する情報を表示し、あなたはGDBコマンドを使用することができます。

  • フレームまたはf

    層数スタック、現在の関数名、関数のパラメータ、およびファイルの関数は、関数がステートメントを実行する行数:この情報を出力します。

  • インフォフレーム
  • 情報F

        このコマンドは、実行時のほとんどの層の現在のスタックに関する詳細情報をプリントアウトし、しかし、ネネアドレスします。たとえば、次のように関数アドレス、関数呼び出しのアドレス、呼び出される関数のアドレス、パラメータアドレスのプログラミング言語、機能、および値で書かれているものの現在の機能は、ローカル変数のアドレス、および。以下のような:

(gdb) info f
Stack level 0, frame at 0xbffff5d4:
eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
called by frame at 0xbffff60c
source language c.
Arglist at 0xbffff5d4, args: n=250
Locals at 0xbffff5d4, Previous frame's sp is 0x0
Saved registers:
ebp at 0xbffff5d4, eip at 0xbffff5d8   
  • 情報引数

   機能の現在のパラメータ名と値をプリントアウト。

  • インフォ地元の人々

   すべてのローカル変数や関数の現在の値をプリントアウト。
  

  • インフォキャッチ

   現在の関数の例外処理情報をプリントアウトします。

            
ソースを表示

ディスプレイソース

GDBはソースコードデバッガをプリントアウトすることができ、もちろん、プログラムが実行可能ファイルにソースコード情報をコンパイルするには、-g追加パラメータを指定してコンパイルする必要があります。そうしないと、ソースコードを参照することはできません。プログラムが停止すると、GDBは、ファイルの最初の数行で停止したプログラムについて報告します。あなたは、プログラムのソースコードを印刷するには、listコマンドを使用することができます。またはソースコードビューGDBコマンドバーを見てみましょう。
   

  • リスト<LINENUM>

    第LINENUM行の周りのプログラムのソースコードを表示します。

  • リスト<機能>

    表示機能は、ソース関数の機能を命名します。
   

  • リスト

    線光源の背後に電流を表示します。

  • リスト -

    ソースコードの現在のフロントラインを表示します。

5は、一般的に表示機能が下位8行は行2である場合には、ライン10はもちろん、範囲も表示ソースを設定するには、次のコマンドを使用して、カスタム表示することができ、デフォルトで、現在の行と次の行5に印刷され行の数。

  • セットLISTSIZE <回数>

    ソースコードの表示行数を設定します。
   

  • ショーLISTSIZE

    LISTSIZEは、現在の設定を表示します。
       

listコマンドは、次の使用方法があります。

  • リスト<最初>、<最後>

    間のソースコードの最後の行に最初の行を表示します。

  • リスト、<最後>

    間の最後の行に現在のソース行を表示します。
   

  • リスト+

    次は、ソースコードを表示します。
       

一般に、これは彼らのリストの後ろに、以下のパラメータを続けることができます。

<linenum>   行号。
<+offset>   当前行号的正偏移量。
<-offset>   当前行号的负偏移量。
<filename:linenum>  哪个文件的哪一行。
<function>  函数名。
<filename:function> 哪个文件中的哪个函数。
<*address>  程序运行时的语句在内存中的地址。

第二に、ソースコードの検索

それだけでなく、GDBは、ソースコードの検索コマンドが用意されています。

  • 前方検索<正規表現>
  • 検索<正規表現>

    フロントに検索します。

  • 逆検索<正規表現>

        すべての検索。
       
ここで、<正規表現>は正規表現ですが、また、マスターパターンマッチング文字列は、正規表現に、私はここについて話が、関連する情報を参照してくださいません。


第三には、ソースファイルのパスを指定します

時には、-gコンパイル後のプログラムの実装とパス名のない唯一のソースファイルの名前に含まれています。GDBは、コマンドを使用すると、GDB検索のためのソースファイルのパスを指定することができます提供します。

  • ディレクトリ<dirnameは...>
  • DIR <dirnameは...>

    現在のパスの前に、ソースファイルパスを追加します。あなたが複数のパスを指定したい場合は、UNIXを使用することができます「:」Windowsでは、使用することができます「;」。

  • ディレクトリ

    すべてのカスタムのための明確な検索パスの情報源。

  • ショーディレクトリ

    これは、ソースファイルの検索パスの表示を定義します。
       

第四に、ソースメモリ

あなたは、メモリ内のアドレスのためのソースコードを表示するには、info lineコマンドを使用することができます。、「ファイル名:機能」:情報バックラインは「行番号」、「機能」、「行番号ファイル名」を続けることができ、このコマンドは、実行時に指定されたソースコードのメモリアドレスを出力します、例えば:

(GDB)情報ラインtst.c:FUNC
0x804845d <FUNC + 13>で"tst.c"アドレス0x8048456 <FUNC + 6>で開始と終了の5行目。

コマンドが実行されたときにあなたは、現在のマシンコードのソースコードを表示することができ、このコマンドは、命令メモリダンプを提示する(逆アセンブルし)もあります。次の例では、関数funcビューアセンブラコードを表します。

(gdb) disassemble func
Dump of assembler code for function func:
0x8048450 <func>:       push   %ebp
0x8048451 <func+1>:     mov    %esp,%ebp
0x8048453 <func+3>:     sub    $0x18,%esp
0x8048456 <func+6>:     movl   $0x0,0xfffffffc(%ebp)
0x804845d <func+13>:    movl   $0x1,0xfffffff8(%ebp)
0x8048464 <func+20>:    mov    0xfffffff8(%ebp),%eax
0x8048467 <func+23>:    cmp    0x8(%ebp),%eax
0x804846a <func+26>:    jle    0x8048470 <func+32>
0x804846c <func+28>:    jmp    0x8048480 <func+48>
0x804846e <func+30>:    mov    %esi,%esi
0x8048470 <func+32>:    mov    0xfffffff8(%ebp),%eax
0x8048473 <func+35>:    add    %eax,0xfffffffc(%ebp)
0x8048476 <func+38>:    incl   0xfffffff8(%ebp)
0x8048479 <func+41>:    jmp    0x8048464 <func+20>
0x804847b <func+43>:    nop
0x804847c <func+44>:    lea    0x0(%esi,1),%esi
0x8048480 <func+48>:    mov    0xfffffffc(%ebp),%edx
0x8048483 <func+51>:    mov    %edx,%eax
0x8048485 <func+53>:    jmp    0x8048487 <func+55>
0x8048487 <func+55>:    mov    %ebp,%esp
0x8048489 <func+57>:    pop    %ebp
0x804848a <func+58>:    ret
End of assembler dump.

 
----------------
免責事項:この記事は元の記事CSDNブロガー「haoel」で、CC 4.0 BY-SAの著作権契約書に従ってください、複製、元のソースのリンクと、この文を添付してください。 。
オリジナルリンクします。https://blog.csdn.net/haoel/article/details/2882

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

おすすめ

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