gdbデバッガ

3825 ワード

https://github.com/me115/linuxtools_rst/blob/master/tool/gdb.rst#gdb
gdbデバッガ
GDBは、GNUのオープンソース組織によって発表されたUNIX/LINEUXオペレーティングシステムの下で、コマンドラインベースの強力なプログラムデバッグツールです.Linuxで働いているc++プログラマーにとって、gdbは欠かせないツールです.
gdbの起動
C/C++プログラムのデバッグには、コンパイル前に-gオプションを追加する必要があります.
$g++ -g hello.cpp -o hello

デバッグ実行ファイル:
$gdb <program>

プログラムはあなたの実行ファイルで、一般的には現在のディレクトリの下にあります.
デバッグcoreファイル(coreはプログラムが不正に実行された後にcore dumpが発生したファイル):
$gdb <program> <core dump file>
$gdb program core.11127

デバッグサービス:
$gdb <program> <PID>
$gdb hello 11127

プログラムがサービスプログラムである場合、このサービスプログラムの実行時のプロセスIDを指定できます.gdbは自動的にattachに上がり、彼をデバッグします.プログラムはPATH環境変数で検索する必要があります.
gdbインタラクティブコマンド
gdbを起動した後、インタラクティブモードに入り、以下のコマンドでプログラムのデバッグを完了します.注意高周波で使用するコマンドは一般的に略語があり、これらの略語コマンドを熟練して使用するとデバッグの効率を高めることができます.
うんてん
  • run:rと略記し、プログラムを実行する役割を果たし、ブレークポイントに遭遇すると、プログラムはブレークポイントで実行を停止し、ユーザーが次のコマンドを入力するのを待つ.
  • continue(略記c):次のブレークポイント(または実行終了)
  • まで実行を続行します.
  • next:(略記n)、単一ステップトラッキングプログラムは、関数呼び出しに遭遇した場合も、この関数体に入らない.このコマンドとstepの主な違いは、stepがユーザー定義の関数に遭遇し、ステップを関数に移行して実行し、nextは直接関数を呼び出し、関数体内に入らないことである.
  • step(略記s):単一ステップデバッグ関数呼び出しがある場合は関数に入る;コマンドnとは異なり、nは呼び出しの関数に入らない
  • である.
  • until:ループ内の単一ステップ追跡に飽きた場合、このコマンドはループを終了するまでプログラムを実行できます.
  • until+行番号:ループ
  • から飛び出すだけでなく、ある行に実行します.
  • finish:現在の関数が戻るまでプログラムを実行し、関数が戻るときのスタックアドレスや戻り値、パラメータ値などの情報を印刷します.
  • call関数(パラメータ):プログラムに表示される関数を呼び出し、call gdb_などの「パラメータ」を渡します.test(55)
  • quit:qと略記し、gdb
  • を終了する
    ブレークポイントの設定

  • break n(略記b n):n行目にブレークポイントを設定する
    (コードパスとコード名を付けることができます:b OAGUPDATE.cpp:578)
  • b fn 1 if a>b:条件ブレークポイント設定
  • break func(breakをbと略す):関数func()の入口にブレークポイントを設定します.たとえば、break cb_button
  • deleteブレークポイント番号n:n番目のブレークポイント
  • を削除
  • disableブレークポイントn:n番目のブレークポイント
  • を一時停止
  • enableブレークポイントn:n番目のブレークポイント
  • をオンにします.
  • clear行番号n:n行目のブレークポイント
  • をクリア
  • info b(info breakpoints):現在のプログラムのブレークポイント設定を表示する
  • delete breakpoints:すべてのブレークポイントをクリア:
  • ソースコードの表示
  • list:lと略記します.プログラムのソースコードをリストし、デフォルトでは10行ずつ表示します.
  • list行番号:現在のファイルの「行番号」を中心とした前後10行のコードが表示されます.たとえば、list 12
  • list関数名:「関数名」が存在する関数のソースコードが表示されます.たとえば、list main
  • list:パラメータなしで、前回のlistコマンドに続いて、下の内容が出力されます.

  • 式の印刷
  • print式:pと略記され、式は現在テスト中のプログラムの有効な式、例えば現在C言語をデバッグしているプログラムであってもよく、式は数値、変数、さらには関数呼び出しを含む任意のC言語の有効な式であってもよい.
  • print a:整数aの値
  • が表示されます.
  • print++a:aの値を1加算し、
  • を表示します.
  • print name:文字列nameの値
  • が表示されます.
  • print gdb_test(22):整数22をパラメータとしてgdb_が呼び出されるtest()関数
  • print gdb_test(a):変数aをパラメータとしてgdb_を呼び出すtest()関数
  • display式:単一ステップで実行する場合に便利です.displayコマンドを使用して式を設定すると、単一ステップごとに命令が行われた後、設定された式と値が出力されます.例えば、display a
  • watch式:監視ポイントを設定し、監視されている「式」の値が変更されると、gdbはデバッグ中のプログラムを強制的に終了します.例えば、watch a
  • whatis:クエリー変数または関数
  • info function:クエリー関数
  • 拡張info locals:現在のスタックページのすべての変数
  • を表示します.
    クエリー実行情報
  • where/bt:現在実行されているスタックのリスト;
  • bt backtrace現在の呼び出しスタック
  • を表示
  • up/downスタック表示の深さを変更
  • set argsパラメータ:運転時を指定するパラメータ
  • show args:設定されたパラメータを表示
  • infoプログラム:プログラムが実行されているかどうか、プロセス番号、一時停止されている理由を確認します.

  • ウィンドウの分割
  • layout:ウィンドウを分割するために使用され、コードを表示しながらテストできます:
  • layout src:ソースコードウィンドウ
  • を表示
  • layout asm:逆アセンブリウィンドウ
  • を表示
  • layout regs:ソースコード/逆アセンブリとCPUレジスタウィンドウ
  • を表示
  • layout split:ソースコードと逆アセンブリウィンドウ
  • を表示
  • Ctrl+L:ウィンドウをリフレッシュ
  • Note
    インタラクティブモードで直接車に戻る役割は前の指令を繰り返すことであり、単一ステップのデバッグに非常に便利である.
    より強力なツール
    cgdb
    cgdbはgdbのgdb−tuiの代わりにgdbのインタフェース増強版と見なすことができる.cgdbの主な機能は、デバッグ時にコードの同期表示を行うことであり、デバッグの利便性が向上し、デバッグ効率が向上するに違いない.インタフェースはviに似ていて、unix/linuxの下で開発者の習慣に合っています.gdbとviに詳しい場合は、ほとんどすぐにcgdbを使用することができます.