GDB チュートリアル
GDBを使い始める
サーチ…
備考
GDB(GNUプロジェクトデバッガ)は、実行中のプログラムとコアプログラムを解析するのに優れたコマンドラインベースのデバッガです。 ユーザマニュアルによると、GDBはC、C ++、D、Go、Objective-C、Fortran、Java、OpenCL C、Pascal、Rust、アセンブリ、Modula-2、Adaをサポートしています 。
GDBはほとんどのデバッガと同じ機能セットを持っていますが、GUIエレメントをクリックするのではなく、コマンドを入力することに基づいています。これらの機能の一部は次のとおりです。
- ブレークポイントの設定
- 変数の値を表示します。
- 変数をテストするための値を設定する。
- スタックの表示
GDBとは?
GNUデバッガの略語であるGDBは、UNIXシステムでCおよびC ++プログラムをデバッグする最も一般的なデバッガです。 GNUデバッガ(gdbとも呼ばれる)は、CおよびC ++プログラムをデバッグするためのUNIXシステム用の最も一般的なデバッガです。
GNUデバッガは、以下の情報を得るのに役立ちます:
コアダンプが発生した場合、プログラムがクラッシュした文または表現は何ですか?
関数の実行中にエラーが発生した場合は、
プログラムにはその関数への呼び出しが含まれています。
パラメーター?プログラムの実行中の特定の時点でのプログラム変数の値は何ですか?
プログラムの特定の表現の結果は何ですか?
GDBの起動
GDBを起動するには、端末で、
gdb <executable name>
mainというプログラムで上記の例を実行すると、コマンドは次のようになります。
gdb main
ブレークポイントの設定
プログラムの状態を確認できるように、ある時点でプログラムを停止することをお勧めします。プログラムを一時的に停止させたい行をブレークポイントと呼びます。
break <source code line number>
あなたのプログラムを実行する
あなたのプログラムを実行するために、コマンドはあなたが推測したように、
run
コアを開く
gdb -c coreFile pathToExecutable
コアファイルの操作
この本当に悪いプログラムを作成しました
#include <stdio.h>
#include <ctype.h>
// forward declarations
void bad_function()
{
int *test = 5;
free(test);
}
int main(int argc, char *argv[])
{
bad_function();
return 0;
}
gcc -g ex1.c
./a.out //or whatever gcc creates
Segmentation fault (core dumped)
gdb -c core a.out
Core was generated by `./a.out'.
プログラムはシグナルSIGSEGVで終了しました。 #0 __GI___libc_free(mem = 0x5)at malloc.c:2929 2929 malloc.c:そのようなファイルやディレクトリはありません。
(gdb) where
#0 __GI___libc_free(mem = 0x5)malloc.c:ex1.c:bad_function()内の2929#1 0x0000000000400549:ex2:main(argc = 1、argv = 0x7fffb825bd68)の0x0000000000400564
私が-gでコンパイルして以来、whereを呼び出すとbad_function()の12行目のコードが気に入らないことがわかります
それから私は自由にしようとしたテスト変数を調べることができます
(gdb) up
ex1.cのbad_function()内の#1 0x0000000000400549:12 12 free(test);
(gdb) print test
$ 1 =(int *)0x5
(gdb) print *test
アドレス0x5のメモリにアクセスできない
この場合、バグはかなり明白です。mallocで作成されていないアドレス5が割り当てられたポインタを解放しようとしましたが、フリーでは何をすべきか分かりません。