Gnu-debugger-gdb-debugging-example1

提供:Dev Guides
移動先:案内検索

GDB-デバッグの例1

コアダンプを生成するプログラムを作成しましょう。

#include <iostream>
using namespace std;

int divint(int, int);
int main()
{
   int x = 5, y = 2;
   cout << divint(x, y);

   x =3; y = 0;
   cout << divint(x, y);

   return 0;
}

int divint(int a, int b)
{
   return a/b;
}

デバッグを有効にするには、プログラムを-gオプションでコンパイルする必要があります。

$g++ -g crash.cc -o crash

注: C ソースコードを使用しているため、g コンパイラを使用しています。

さて、Linuxマシンでこのプログラムを実行すると、次の結果が生成されます。

Floating point exception (core dumped)

現在のディレクトリに_core_ファイルがあります。

問題をデバッグするには、コマンドプロンプトでgdbデバッガーを起動します。

$gdb crash
# Gdb prints summary information and then the (gdb) prompt

(gdb) r
Program received signal SIGFPE, Arithmetic exception.
0x08048681 in divint(int, int) (a=3, b=0) at crash.cc:21
21        return a/b;

# 'r' runs the program inside the debugger
# In this case the program crashed and gdb prints out some
# relevant information.  In particular, it crashed trying
# to execute line 21 of crash.cc.  The function parameters
# 'a' and 'b' had values 3 and 0 respectively.

(gdb) l
# l is short for 'list'.  Useful for seeing the context of
# the crash, lists code lines near around 21 of crash.cc

(gdb) where
#0  0x08048681 in divint(int, int) (a=3, b=0) at crash.cc:21
#1  0x08048654 in main () at crash.cc:13
# Equivalent to 'bt' or backtrace.  Produces what is known
# as a 'stack trace'.  Read this as follows:  The crash occurred
# in the function divint at line 21 of crash.cc.  This, in turn,
# was called from the function main at line 13 of crash.cc

(gdb) up
# Move from the default level '0' of the stack trace up one level
# to level 1.

(gdb) list
# list now lists the code lines near line 13 of crash.cc

(gdb) p x
# print the value of the local (to main) variable x

この例では、整数を0で除算しようとしたためにクラッシュが発生することは明らかです。

クラッシュして「core」という名前のコアファイルを生成したプログラム「crash」をデバッグするには、コマンドラインで次のように入力します。

gdb crash core

これは、gdbを起動して「r」コマンドを入力するのとほぼ同じであるため、上記のすべてのコマンドを使用してファイルをデバッグできます。