トップ
gdbとは
gdbは、コアダンプの解析に使えるなど強力なツールです。でもC言語の知識がないとさっぱりです。そこで、C言語からじゃなくて、gccコンパイル、C言語、gdbコマンドを一緒に入門してしまう一石二鳥のコンテンツをまとめてみました。
なお、本コンテンツはLinux環境を前提に解説しています。Linux環境に触れたことがない方は読みにくい内容となっています。
このページの目次です。
C言語の入門知識から見ていきます。
C言語とは、WindowsやLinuxなどコア部分のカーネルやデバイスドライバに加え、Webサーバやデータベースなどのミドルウェア、Javaなど他のプログラミング言語の実行環境などもC言語で記述して作られています。
C言語の入門ソースコードは以下がおなじみです。
#include <stdio.h>
int main(void){
printf("Hello, world!\n");
return 0;
}
C言語は、ソースコードを書くだけでは動くプログラムが作れません。
実行できる形式のファイルに変換(コンパイル)する必要があります。
コンパイルするには、コンパイラーというソフトウェアが必要です。
本コンテンツでは、コンパイラーの1つのgccを使用します。
次にgccコンパイルについて見ていきます。
gccとは、GNUが提供しているオープンソースのコンパイラーです。
実は、C言語だけでなく他の言語のコンパイラーも含まれるコンパイラー群です。 gccと言えばLinux向けですが、UNIX、Windowsなど広く利用できます。
Linux環境の場合、HRELやCentOS、Redoraは「yum install gcc」、Ubuntuは「apt-get install gcc」でインストールできます。
Windowsの場合は、MinGWなどをダウンロードしてきてインストールします。以下はLinuxを前提に進めていきます。
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!
次にgdbコマンドについて見ていきます。ちなみに、gdbは、GNUの開発ツールに搭載されているオープンソースのデバックツールです。
Linux環境を前提に進めています。HRELやCentOS、Redoraは「yum install gdb」、Ubuntuは「apt-get install gdb」でインストールできます。
-gオプションを付けてgccコンパイルして、デバック用のプログラムを作成します。
gcc -g -o hello hello.c
以下のように実行します。
gdb <実行プログラム>
入門プログラムの場合以下のように実行します。
$ gdb hello
簡単なgdbコマンドのオプションとgdbコマンドの実行例を見ていきます。
| コマンド | 省略形 | 効果 |
| run | デバッグ対象プログラムを実行する | |
| break | ブレークポイントを設定する | |
| backtrace | bt | バックトレースを表示する |
| frame N | f | フレームNに移動する |
| list | l | 現在の関数のソースコードを表示する |
| print EXPR | p | 式EXPRの値を表示する |
| info registers | 全てのレジスターとその現在の状態を表示する | |
| continue | c | 続きを実行する |
| quit | q | gdbを終了する |
-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コマンドの実行を見ていきます。
このページの更新履歴です。
Copyright (C) 2015-2023 名科辞典. All Rights Reserved.