[Linux]クイックスタートgdbデバッグツール

序文

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は、変数の前にあるシリアル番号であることに注意してください
ここに画像の説明を挿入

2.9式pの値を出力します

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_52640673/article/details/122852312