名科辞典―これは何?情報は?にこたえるコンテンツ

トップ gdbとは

gdbとは―使い方は?gccコンパイルとgdbコマンドで学ぶC言語入門。

gdbは、コアダンプの解析に使えるなど強力なツールです。でもC言語の知識がないとさっぱりです。そこで、C言語からじゃなくて、gccコンパイル、C言語、gdbコマンドを一緒に入門してしまう一石二鳥のコンテンツをまとめてみました。

なお、本コンテンツはLinux環境を前提に解説しています。Linux環境に触れたことがない方は読みにくい内容となっています。

このページの目次です。

1. C言語の入門知識

2. gccコンパイル

3. gdbコマンド

4. 簡単なgdbコマンドのオプションとgdbコマンドの実行例

更新履歴

1. C言語の入門知識

C言語の入門知識から見ていきます。

C言語とは

C言語とは、WindowsやLinuxなどコア部分のカーネルやデバイスドライバに加え、Webサーバやデータベースなどのミドルウェア、Javaなど他のプログラミング言語の実行環境などもC言語で記述して作られています。

C言語の入門ソースコード

C言語の入門ソースコードは以下がおなじみです。

#include <stdio.h>
int main(void){
	printf("Hello, world!\n");
	return 0;
}

ソースコードだけでは動かない

C言語は、ソースコードを書くだけでは動くプログラムが作れません。

実行できる形式のファイルに変換(コンパイル)する必要があります。

コンパイルするには?

コンパイルするには、コンパイラーというソフトウェアが必要です。

本コンテンツでは、コンパイラーの1つのgccを使用します。

2. gccコンパイル

次にgccコンパイルについて見ていきます。

gccとは

gccとは、GNUが提供しているオープンソースのコンパイラーです。

実は、C言語だけでなく他の言語のコンパイラーも含まれるコンパイラー群です。 gccと言えばLinux向けですが、UNIX、Windowsなど広く利用できます。

gccのインストール

Linux環境の場合、HRELやCentOS、Redoraは「yum install gcc」、Ubuntuは「apt-get install gcc」でインストールできます。

Windowsの場合は、MinGWなどをダウンロードしてきてインストールします。以下はLinuxを前提に進めていきます。

gccコンパイル

C言語の入門ソースコードをhello.cというファイルで保存して、カレントディレクトリで以下のコマンドを実行します。

gcc hello.c

gcc hello.cだけだとa.outというファイルになります。以下のようにするとhelloというファイルにできます。

gcc -o hello hello.c

プログラムの実行

gccでコンパイルすると実行権限が付与されて実行形式ファイルができますのでそのままファイル名を指定すれば実行できます。

$ ./a.out
Hello, world!
$ ./hello
Hello, world!

3. gdbコマンド

次にgdbコマンドについて見ていきます。ちなみに、gdbは、GNUの開発ツールに搭載されているオープンソースのデバックツールです。

gdbコマンドのインストール

Linux環境を前提に進めています。HRELやCentOS、Redoraは「yum install gdb」、Ubuntuは「apt-get install gdb」でインストールできます。

gdbコマンド実行前の準備

-gオプションを付けてgccコンパイルして、デバック用のプログラムを作成します。

gcc -g -o hello hello.c

gdbコマンドの実行方法

以下のように実行します。

gdb <実行プログラム>

入門プログラム実行の実行例

入門プログラムの場合以下のように実行します。

$ gdb hello

4. 簡単なgdbコマンドのオプションとgdbコマンドの実行例

簡単なgdbコマンドのオプションとgdbコマンドの実行例を見ていきます。

gdbコマンドのオプション

コマンド省略形効果
runデバッグ対象プログラムを実行する
breakブレークポイントを設定する
backtracebtバックトレースを表示する
frame NfフレームNに移動する
listl現在の関数のソースコードを表示する
print EXPRp式EXPRの値を表示する
info registers全てのレジスターとその現在の状態を表示する
continuec続きを実行する
quitqgdbを終了する

簡単なgdbコマンドの実行手順の例

  1. 起動:gdb ./対象プログラム名
  2. 表示:gdb>list
  3. 設置:gdb>break [行番号]
  4. 実行:gdb>run [対象プログラムの引数]
  5. 摘出:下記gdbコマンドにてプログラムの解析
  6. 終了:conutinueで最後まで対象プログラムを実行し、quitで終了する

CentOS7での実行例

-qオプションを指定して起動するとはじめの長いメッセージが表示されなくなります。

$ gdb -q hello
Reading symbols from /home/user/work/hello...done.
(gdb) list
1       #include <stdio.h>
2       int main(void) {
3           printf("Hello, world!\n");
4           return 0;
5       }
(gdb) break 2
Breakpoint 1 at 0x400534: file hello.c, line 2.
(gdb) run
Starting program: /home/user/work/hello

Breakpoint 1, main () at hello.c:3
3           printf("Hello, world!\n");
Missing separate debuginfos, use: debuginfo-install glibc-2.17-106.el7_2.8.x86_64
(gdb) bt
#0  main () at hello.c:3
(gdb) info registers
rax            0x400530 4195632
rbx            0x0      0
rcx            0x400550 4195664
rdx            0x7fffffffe598   140737488348568
rsi            0x7fffffffe588   140737488348552
rdi            0x1      1
rbp            0x7fffffffe4a0   0x7fffffffe4a0
rsp            0x7fffffffe4a0   0x7fffffffe4a0
r8             0x7ffff7dd5e80   140737351868032
r9             0x0      0
r10            0x7fffffffe2f0   140737488347888
r11            0x7ffff7a3aa20   140737348086304
r12            0x400440 4195392
r13            0x7fffffffe580   140737488348544
r14            0x0      0
r15            0x0      0
rip            0x400534 0x400534 <main+4>
eflags         0x246    [ PF ZF IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0
(gdb) continue
Continuing.
Hello, world!
[Inferior 1 (process 29503) exited normally]
(gdb) quit

次回は別のC言語の入門プログラムのgccコンパイル、gdbコマンドの実行を見ていきます。

更新履歴

このページの更新履歴です。

  • 2016.11.29 記事をUPしました。

戻る