序文
VSシリーズのIDEでは、グラフィカルウィンドウのデバッグに慣れています。Linuxのコマンドラインでは、ツールgdbを使用してプログラムのデバッグを完了します。
この記事を読んだ後、あなたは知っているでしょう:
- コードを表示
- ブレークポイント、ブレークポイントにジャンプ
- プロセスごと
- ステートメントごとに実行する
- 長い表示変数情報
- 指定された行にジャンプします
- ブレークポイントを無効にする
- デバッグ中に変数を変更する
1.ソースコードをデバッグ可能なバイナリファイルにコンパイルする方法
以前は、C言語のソースファイルmytest.cをコンパイルするときにこのコマンドを使用していました。
gcc mytest.c -o mytest
実行可能ファイルが正常に生成されましたmytest
この実行可能ファイルをgdbで直接デバッグすると、デバッグ情報が見つかりません
。それはなぜですか?
Linuxでプログラムがデフォルトでコンパイルされる場合
- デフォルトで生成される実行可能プログラムはリリースバージョンであり、調整できません
それで
- デバッグする必要があります。gccはコンパイル時に
-g
パラメーター公開して、実行可能ファイルをgdbがデバッグ情報->を使用してトレースおよびデバッグできるようにする必要があります。
gcc mytest.c -o mytest_debug -g
また、デバッグバージョンの実行可能ファイルがリリースバージョンよりも大きいことがわかります。これは、デバッグ情報が追加されているためです。
2.デバッグを開始します
まず、ソースファイルを提供します。
#include <stdio.h>
int sum(int top) {
int _sum = 0;
int i = 0;
for(;i <= top; i++) {
_sum += i;
}
return _sum;
}
int main() {
int max = 0;
printf("please enter your data# ");
scanf("%d",&max);
int _sum = sum(max);
printf("1:%d\n", _sum);
printf("2:%d\n", _sum);
printf("3:%d\n", _sum);
printf("4:%d\n", _sum);
printf("5:%d\n", _sum);
printf("6:%d\n", _sum);
return 0;
}
まず、デバッグ情報を含む実行可能ファイルをコンパイルして生成します
gcc mytest.c -o mytest_debug -g
次に、gdbデバッグ:
gdb mytest_debug
注文 | 効果 |
---|---|
リスト/l | ソースコードを表示する(一度に10行) |
run / r | プログラムを実行する |
次へ/n | プロセスごと |
ステップ/秒 | ステートメントごとに実行すると、関数を入力できます |
ブレーク/b行番号 | 行にブレークポイントを設定する |
情報休憩 | ブレークポイント情報を表示する |
終了 | 現在の関数が戻るまで実行します |
印刷/p | 式の値を出力します |
セットがあります | 変数の値を変更する |
継続する | 次のブレークポイントにジャンプ |
ブレークポイントを削除する | すべてのブレークポイントを削除します |
ブレークポイントを削除するn | シーケンス番号nのブレークポイントを削除します |
ブレークポイントを無効にするn | シーケンス番号nでブレークポイントのトレースを解除します |
ブレークポイントを有効にするn | ブレークポイント番号nの追跡を再開します |
情報ブレークポイント | セットブレークポイントを出力します |
変数名を表示する | 変数を長時間表示する |
変数名を表示しない | 変数の長い表示をキャンセルします |
行番号まで | 行にジャンプ |
quit / q | gdbを終了します |
以下に一般的なコマンドを示します
2.1表示コードl
list/l 行号
ソースコードを表示し、一度に10行を表示してから、Enterキーを押すと下に表示され続けます
2.2プログラムの実行r
デバッグを開始します。つまり、プログラムを実行します。
run/r
rの後、コードは14行目のinputステートメントに対して直接実行され、プログラムはデバッグなしで入力の直後に終了することがわかりました。その理由は、ブレークポイントを設定しなかったためです。ブレークポイントが設定されている場合、rは最初のブレークポイントで停止するため、シングルステップを実行できます。
2.3ブレークポイントの設定と表示
b 行号 //设置断点
info b //查看断点
14、15、19行目にブレークポイントを設定します
2.4次のステップバイステップのデバッグ
プログラムを実行するためにrを続行し、次にnステップスルーします。
n
nは関数本体に入れないことがわかります。これは、nがプロセスごとのデバッグであることを示しています。
2.5ステップのステートメントごとのデバッグ
関数本体にsを入力します
2.6終了は、現在の関数が戻って停止するまで実行されます
finish
2.7c次のブレークポイントにジャンプ
c
2.8ディスプレイ変数の表示長
display 变量名
undisplay 变量序号
undisolayは、変数の前にあるシリアル番号であることに注意してください