目次
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デバッグと比較して、デバッグ中にプログラムが停止することがなく、より実環境に近いというメリットがあります。