Linuxシステム下——GDBデバッグツール基本コマンド
4455 ワード
前言:Linuxシステムの下でVIMプログラミングを始めたばかりで、コンパイル时に発生したエラーを修正することを学びましたが、论理的なエラーやあなたの油断によるエラーが発生しました.时にはコンパイラが発见できないエラーが発生した时、本当に长い时间をかけてエラーを修正し、GDBでデバッグすると便利になります.
GDBへのアクセス方法:
私はgccコンパイルを使っています.
gcc -g file.c -o file
gdb file
これでgdbに入ることができます.
さまざまなコマンドについて説明します.
(1)、list(l)コマンド:
プログラムコードを10行ずつリストします.
パラメータを付けることができます:list 10は、現在の行以降の10行をリストすることを意味します.
(gdb) list
1 #include
2 int main()
3 {
4 int i = 10;
5 i = 11;
6 printf("the address of i is %p and the value of i is %d",&i,i);
7 }
8
gdb)list
(gdb)list 10
(gdb)list 5,10
(gdb)func
たとえば、デフォルトで10行を表示したり、5行目から10行目を指定したり、関数コードを表示したりすることができます.
しかし、最良の提案はやはり2つの端末を開いて、コードを見ながら、デバッグして、見ていて気持ちがいいことです.
(2)、ブレークポイントbreak point(b)+行番号または関数名の設定
デバッグしたプログラムでブレークポイントを設定できます.このコマンドには、次の4つの形式があります.
プログラムが多くの元のファイルで構成されている場合は、現在の元のファイルではなく、各元のファイルにブレークポイントを設定できます.その方法は次のとおりです.
break if
条件ブレークポイントを設定するには、break ifコマンドを使用します.次のようにします.
1.現在のgdbのブレークポイント情報を表示する
info break
2.delete指定したブレークポイントを削除
delete breakpoint
3. ブレークポイントの使用を禁止、許可する
disable breakpoint 1
enable breakpoint 1
このコマンドは、ブレークポイント1を禁止、許可するとともに、ブレークポイント情報の(Enb)ドメインがn、yになる
(3)、ワンステップ実行
next/n
ステップ実行しない
step
ステップ実行
finish
すでに関数に入っていて、関数を終了して呼び出し関数に戻る場合は、コマンドfinishを使用します.
until
現在のループを終了(4)、
backtrace/btは、プログラム内の現在の位置と、現在の位置に到達する方法を示すスタックトラッキング(同義語:where)を表示します.
(5)このプログラムrun(r)を実行する
ブレークポイントがある場合は、プログラムはブレークポイントの行に停止します.
(6)、finishは、現在の関数が戻るまでプログラムを実行し、関数が戻るときのスタックアドレスや戻り値、パラメータ値などの情報を印刷します.
(7)、stepiまたはsi nextiまたはni
単一ステップで機械指令を追跡!1つのプログラムコードは、複数のマシン命令によって完了する可能性があり、stepiおよびnextiは、マシン命令を単一ステップで実行することができる.これと同様の機能を持つコマンドは「display/i$pc」であり、このコマンドを実行すると、プログラムコードと同時にマシンコマンド(アセンブリコード)が単一ステップでトレースされます.
(8)、運転時のデータポイントの表示
プログラムをデバッグするときに、プログラムが停止されたときにprintコマンド(略記コマンドはp)を使用するか、同義コマンドinspectを使用して現在のプログラムの実行データを表示できます.printコマンドのフォーマットは次のとおりです.
print
print/
は式で、あなたがデバッグしたプログラムの言語の式(GDBは多種のプログラミング言語をデバッグすることができます)で、出力のフォーマットで、例えば、式を16進数のフォーマットで出力するならば、/xです.
はいれつ
連続したメモリ領域の値を表示する必要がある場合があります.たとえば、配列のセグメントや、動的に割り当てられたデータのサイズなどです.gdbの「@」オペレータを使用すると、「@」の左側が最初のメモリのアドレスの値で、「@」の右側がメモリの
長さ.たとえば、プログラムには、連続したメモリ領域の値を表示する必要がある場合があります.たとえば、配列のセグメントや、動的に割り当てられたデータのサイズなどです.GDBの"@"オペレータを使用できます."@"の左側は最初のメモリのアドレスです.
の値を入力します.たとえば、プログラムには次のような文があります.
int *array = (int *) malloc (len * sizeof (int));
そこで、GDBのデバッグ中に、この動的配列の値を次のコマンドで表示できます.
p *array@len
@の左側は配列のヘッダアドレスの値、すなわち変数arrayが指す内容であり、右側はデータの長さであり、変数lenに保存され、その出力結果は、以下のようになる.
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}
静的配列であればprint配列名をそのまま使えば、配列中のすべてのデータの内容を表示できます.
(9)、自動ディスプレイ
自動表示の変数を設定したり、プログラムが停止したり、単一ステップで追跡したりすると、これらの変数が自動的に表示されます.関連するgdbコマンドはdisplayです.
display
display/
display/
exprは式で、fmtは表示のフォーマットを表し、addrはメモリアドレスを表し、displayで1つ以上の式を設定すると、プログラムが停止すると、gdbは自動的に設定した式の値を表示します.
フォーマットiとsは同様にdisplayによってサポートされており、非常に有用なコマンドは次のとおりです.
display/i $pc
$pcはgdbの環境変数であり,命令のアドレスを表し,/iは出力フォーマットが機械命令コード,すなわちアセンブリであることを示す.するとプログラムが停止すると、ソースコードとマシン命令コードが対応する場合があり、興味深い機能です.
(10)、観察点watchの設定
観察された変数が変化するとプログラムが停止する「観察ブレークポイント」を設定します.
yo !peace!
GDBへのアクセス方法:
私はgccコンパイルを使っています.
gcc -g file.c -o file
gdb file
これでgdbに入ることができます.
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
(gdb)
さまざまなコマンドについて説明します.
(1)、list(l)コマンド:
プログラムコードを10行ずつリストします.
パラメータを付けることができます:list 10は、現在の行以降の10行をリストすることを意味します.
(gdb) list
1 #include
2 int main()
3 {
4 int i = 10;
5 i = 11;
6 printf("the address of i is %p and the value of i is %d",&i,i);
7 }
8
gdb)list
(gdb)list 10
(gdb)list 5,10
(gdb)func
たとえば、デフォルトで10行を表示したり、5行目から10行目を指定したり、関数コードを表示したりすることができます.
しかし、最良の提案はやはり2つの端末を開いて、コードを見ながら、デバッグして、見ていて気持ちがいいことです.
(2)、ブレークポイントbreak point(b)+行番号または関数名の設定
デバッグしたプログラムでブレークポイントを設定できます.このコマンドには、次の4つの形式があります.
//
break line-number
//
break function-name
// condition( ) ,
break line-or-function if condition
//
break routine-name
プログラムが多くの元のファイルで構成されている場合は、現在の元のファイルではなく、各元のファイルにブレークポイントを設定できます.その方法は次のとおりです.
(gdb) break filename:line-number
(gdb) break filename:function-name
break if
条件ブレークポイントを設定するには、break ifコマンドを使用します.次のようにします.
(gdb) break line-or-function if expr
(gdb) break 46 if testsize==100
1.現在のgdbのブレークポイント情報を表示する
info break
2.delete指定したブレークポイントを削除
delete breakpoint
// 1
(gdb) delete breakpoint 1
// ,
(gdb) delete breakpoint
3. ブレークポイントの使用を禁止、許可する
disable breakpoint 1
enable breakpoint 1
このコマンドは、ブレークポイント1を禁止、許可するとともに、ブレークポイント情報の(Enb)ドメインがn、yになる
(3)、ワンステップ実行
next/n
ステップ実行しない
step
ステップ実行
finish
すでに関数に入っていて、関数を終了して呼び出し関数に戻る場合は、コマンドfinishを使用します.
until
現在のループを終了(4)、
backtrace/btは、プログラム内の現在の位置と、現在の位置に到達する方法を示すスタックトラッキング(同義語:where)を表示します.
(5)このプログラムrun(r)を実行する
ブレークポイントがある場合は、プログラムはブレークポイントの行に停止します.
(6)、finishは、現在の関数が戻るまでプログラムを実行し、関数が戻るときのスタックアドレスや戻り値、パラメータ値などの情報を印刷します.
(7)、stepiまたはsi nextiまたはni
単一ステップで機械指令を追跡!1つのプログラムコードは、複数のマシン命令によって完了する可能性があり、stepiおよびnextiは、マシン命令を単一ステップで実行することができる.これと同様の機能を持つコマンドは「display/i$pc」であり、このコマンドを実行すると、プログラムコードと同時にマシンコマンド(アセンブリコード)が単一ステップでトレースされます.
(8)、運転時のデータポイントの表示
プログラムをデバッグするときに、プログラムが停止されたときにprintコマンド(略記コマンドはp)を使用するか、同義コマンドinspectを使用して現在のプログラムの実行データを表示できます.printコマンドのフォーマットは次のとおりです.
print/
は式で、あなたがデバッグしたプログラムの言語の式(GDBは多種のプログラミング言語をデバッグすることができます)で、出力のフォーマットで、例えば、式を16進数のフォーマットで出力するならば、/xです.
はいれつ
連続したメモリ領域の値を表示する必要がある場合があります.たとえば、配列のセグメントや、動的に割り当てられたデータのサイズなどです.gdbの「@」オペレータを使用すると、「@」の左側が最初のメモリのアドレスの値で、「@」の右側がメモリの
長さ.たとえば、プログラムには、連続したメモリ領域の値を表示する必要がある場合があります.たとえば、配列のセグメントや、動的に割り当てられたデータのサイズなどです.GDBの"@"オペレータを使用できます."@"の左側は最初のメモリのアドレスです.
の値を入力します.たとえば、プログラムには次のような文があります.
int *array = (int *) malloc (len * sizeof (int));
そこで、GDBのデバッグ中に、この動的配列の値を次のコマンドで表示できます.
p *array@len
@の左側は配列のヘッダアドレスの値、すなわち変数arrayが指す内容であり、右側はデータの長さであり、変数lenに保存され、その出力結果は、以下のようになる.
(gdb) p *array@len
$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}
静的配列であればprint配列名をそのまま使えば、配列中のすべてのデータの内容を表示できます.
(9)、自動ディスプレイ
自動表示の変数を設定したり、プログラムが停止したり、単一ステップで追跡したりすると、これらの変数が自動的に表示されます.関連するgdbコマンドはdisplayです.
display
display/
display/
exprは式で、fmtは表示のフォーマットを表し、addrはメモリアドレスを表し、displayで1つ以上の式を設定すると、プログラムが停止すると、gdbは自動的に設定した式の値を表示します.
フォーマットiとsは同様にdisplayによってサポートされており、非常に有用なコマンドは次のとおりです.
display/i $pc
$pcはgdbの環境変数であり,命令のアドレスを表し,/iは出力フォーマットが機械命令コード,すなわちアセンブリであることを示す.するとプログラムが停止すると、ソースコードとマシン命令コードが対応する場合があり、興味深い機能です.
(10)、観察点watchの設定
観察された変数が変化するとプログラムが停止する「観察ブレークポイント」を設定します.
yo !peace!