C/C++ プログラムをデバッグする一般的な方法

gdb デバッグ

gdb をインストールする

使用する前に gdb をインストールする必要があります。

yum install -y gdb

使用前の準備

ファイルをコンパイルするときは、-gコンパイルされたファイルを確実にデバッグできるようにパラメーターを追加する必要があります。

g++ -g demo.cpp -o demo

gdb を使用する

デモコード 1

#include <unistd.h>
#include <bits/stdc++.h>
using namespace std;

void print()
{
    
    
    cout << "hello world 111" << endl;
    cout << "hello world 222" << endl;
    cout << "hello world 333" << endl;
}

int main(int argc, char **argv)
{
    
    
    for (int i = 0; i < argc; i++)
        cout << i << ' ' << argv[i] << endl;

    int a = 1;
    cout << a << endl;
    a++;
    cout << a << endl;
    a++;
    cout << a << endl;
    print();
    a++;
    cout << a << endl;
    a++;
    cout << a << endl;
    return 0;
}

デバッグに入る

gdb 可执行文件名

gdb デバッグを正常に開始すると、コマンド ライン ヘッダー記述子が (gdb) 形式に変更されていることがわかります。
ここに画像の説明を挿入

プログラムを実行する

run コマンドは、プログラムの実行を開始し、ブレークポイントに遭遇すると停止し、ブレークポイントがない場合は終了します。このコマンドは r と省略できます

(gdb) r

ブレークポイントが設定されていないため、プログラムが終了したことがわかります。
写真の説明を追加してください

ブレークポイントを設定

break 行番号、この行にブレークポイントを設定すると、この行まで実行するとプログラムが停止します。このコマンドは b と省略できます

(gdb) break row_id

12行目にブレークポイントが設定されているため、runコマンドの実行後、プログラムは12行目で停止します。
ここに画像の説明を挿入

次のステップ

両方とも次のステップである 2 つのコマンドがあります。

次のコマンドは、現在のステートメントを実行します. 関数呼び出しが発生した場合、関数には入りません (関数は実行されますが、gdb は関数に入りません)。このコマンドは n と省略できます

(gdb) next

写真の説明を追加してください

step コマンドは現在のステートメントを実行します. 関数呼び出しに遭遇した場合 (ライブラリ関数ではなく、必要に応じてそれ自体で宣言された関数)、関数に入ります. このコマンドは s と省略できます。

(gdb) step

写真の説明を追加してください

実行し続ける

ブレークポイントに遭遇してプログラムが停止した後、continue コマンドを使用して、次のブレークポイントに遭遇するまでプログラムを実行し続けることができます。このコマンドは、c と省略できます。

(gdb) continue

ブレークポイントに到達すると、プログラムは 12 行目で停止し、continue コマンドを入力すると、プログラムは最後まで実行を続けます。

写真の説明を追加してください

メイン関数のパラメーターを設定する

デモ コードでは、プログラムの実行時に次のようにメイン関数でパラメーターを渡すことができます。

./demo arg1 arg2 arg1000

実行結果は次のとおりです。
写真の説明を追加してください
ただし、gdb モードでは、このようなパラメーターを渡すことはできません。

ここに画像の説明を挿入
そのため、新しい方法でパラメーターをメイン プログラムに渡す必要があります。

(gdb) set args 参数1 参数2 ... ... 

ここに画像の説明を挿入

印刷変数

変数値を表示するには、print コマンドを使用します。pに改称・略称

(gdb) print a

写真の説明を追加してください

やめる

quit コマンドを使用して、gdb のデバッグを終了します。このコマンドは q と省略できます

(gdb) quit

写真の説明を追加してください

コアダンプ

Linux では、ulimit コマンドを使用して、シェル実行プログラムのリソースを制御します。coredump を使用する前に、core ファイルの最大値を無制限に設定する必要があります。

ulimit -c unlimited

プログラムが異常終了すると、プログラムのデバッグに使用できるコア ファイルが生成されます。

写真の説明を追加してください

デモコード 2

#include <unistd.h>
#include <bits/stdc++.h>
using namespace std;

int main(int argc, char **argv)
{
    
    
    cout << 1 / 0 << endl;
    return 0;
}

上記のコードをコンパイルして実行すると、プログラムはエラーを発生させて終了します。ls コマンドを使用してファイルを表示すると、コア ファイルを見つけることができます。

次のコマンドを使用して、コア ファイルをデバッグします。

gdb 可执行文件名 对应的core文件

写真の説明を追加してください

間違ったステートメントをより直感的に見ることができ、もちろん他の情報も非常に役立ちます。

プログラムログ

プログラム ログの形式を使用してデバッグします。本質的には途中結果を出力するデバッグ方法であり、gdbデバッグと比較して、デバッグ中にプログラムが停止することがなく、より実環境に近いというメリットがあります。

参考文献

  1. C言語技術ネットワーク

  2. Bilibili_C言語技術ネットワーク_C言語でのgdbデバッグの本質

おすすめ

転載: blog.csdn.net/hesorchen/article/details/124436643