GDBの基本使用

5087 ワード

gdbは強力なデバッグプログラムであり、次のデバッグタスクを実行できます.
-ブレークポイントの設定
-モニタ変数の値
-プログラムの単一ステップ(step in/step over)実行
-変数の値の表示/変更
-レジスタの表示/変更
-プログラムのスタックの表示
-リモートデバッグ
-デバッグスレッド
gdbデバッガを使用する前に、-gまたは-ggdbコンパイルオプションを使用してソースファイルをコンパイルする必要があります.gdbデバッガを実行するときは、通常、次のコマンドが使用されます.
gdb progname
gdbプロンプトにhelpを入力すると、コマンドの分類がリストされます.主な分類は次のとおりです.
-aliases:コマンド別名
-breakpoints:ブレークポイント定義;
-data:データ表示;
-files:ファイルを指定して表示します.
-internals:メンテナンスコマンド;
-running:プログラム実行;
-stack:スタック表示を呼び出します.
-status:ステータス表示;
-tracepoints:トレースプログラム実行.
helpとコマンドの分類名を入力すると、このクラスのコマンドの詳細リストが表示されます.gdbの一般的なコマンドは以下の表に示す.
<table>
<tr><td>break FILENAME:NUM</td><td>              </td></tr>
<tr><td>clear FILENAME:NUM</td><td>                 </td></tr>
<tr><td>run</td><td>      </td></tr>
<tr><td>step</td><td>        ,        </td></tr>
<tr><td>next</td><td>        ,       </td></tr>
<tr><td>backtrace</td><td>         。               </td></tr>
<tr><td>where continue</td><td>           </td></tr>
<tr><td>display EXPR</td><td>              ,             </td></tr>
<tr><td>file FILENAME</td><td>              </td></tr>
<tr><td>help CMDNAME</td><td>             </td></tr>
<tr><td>info break</td><td>        ,           </td></tr>
<tr><td>info files</td><td>            </td></tr>
<tr><td>info func</td><td>              </td></tr>
<tr><td>info prog</td><td>            </td></tr>
<tr><td>info local</td><td>                   </td></tr>
<tr><td>info var</td><td>                   </td></tr>
<tr><td>kill</td><td>          </td></tr>
<tr><td>list</td><td>           </td></tr>
<tr><td>quit</td><td>   gdb</td></tr>
</table>
gdbの使用について、エラーのある例プログラムで説明します.
```
/*bugging.c*/
#include
#include    
static char buff [256];
static char* string;
int main ()
{
printf ("Please input a string: ");
gets (string);
printf ("Your string is: %s", string);
}
 ``
このプログラムは,ユーザの入力を受け入れ,ユーザの入力を印刷する.このプログラムは初期化されていない文字列アドレスstringを使用しているため、コンパイルして実行すると「Segment Fault」エラーが発生します.
$ gcc -o bugging -g  bugging.c
$ ./bugging
Please input a string: asdf
Segmentation fault (core dumped)
 
プログラムに発生する問題を検索するには、gdbを使用して、次の手順に従います.
[1]gdb buggingを実行し、bugging実行可能ファイルをロードする.
$gdb bugging 
[2]ロードされたbuggingコマンドを実行する.
(gdb) run
[3]whereコマンドを使用してプログラムエラーの場所を表示する.
(gdb) where
[4]listコマンドを使用してgets関数を呼び出す近くのコードを表示する.
(gdb) list
[5]gdbでは、11行目にブレークポイントを設定し、11行目でエラーが発生したかどうかを確認します.
(gdb) break 11
[6]プログラムが11行目に再実行されて停止すると、プログラムは正常になり、ステップコマンドnextが実行される.
(gdb)next[7]プログラムは確かにエラーが発生し、gets関数のエラーを引き起こす要因は変数stringである.テストプログラムを再実行し、printコマンドでstringの値を表示します.(gdb)run(gdb)print string(gdb)$1=0 x 0[8]問題はstringが無効なポインタを指し、プログラムを修正し、10行と11行の間に「string=buff;」という文を追加し、プログラムを再コンパイルし、実行を続行すると、正しいプログラムの実行結果が表示されることです.  gdbでソースコードを表示するにはlistコマンドを使用しますが、これは柔軟ではありません.「layout src」コマンドを使用するか、Ctrl-Xを押してAを押すと、ソースコードを表示できるウィンドウが表示されます.-tuiパラメータを使用することで、gdbに入るとコード表示ウィンドウを直接開くことができます.その他のコードウィンドウ関連コマンド:
<table>
<tr><td>info win</td><td>       </td></tr>
<tr><td>layout next</td><td>          </td></tr>
<tr><td>layout prev</td><td>          </td></tr>
<tr><td>layout src</td><td>      </td></tr>
<tr><td>layout asm</td><td>       </td></tr>
<tr><td>layout split</td><td>          </td></tr>
<tr><td>layout regs</td><td>         </td></tr>
<tr><td>focus cmd/src/asm/regs/next/prev</td><td>      </td></tr>
<tr><td>refresh</td><td>      </td></tr>
<tr><td>tui reg next</td><td>        </td></tr>
<tr><td>tui reg system</td><td>       </td></tr>
<tr><td>update</td><td>             </td></tr>
<tr><td>winheight name +/- line</td><td>  name     </td></tr>
<tr><td>tabset nchar</td><td>  tab nchar   </td></tr>
</table>