gdbでデバッグするためのgccのデバッグ情報のオプション

提供: C言語入門
2016年8月13日 (土) 00:22時点におけるDaemon (トーク | 投稿記録)による版 (関連項目)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索
スポンサーリンク

gdb でデバッグするときに必要になるのがデバッグ情報です。デバッグ情報がないと、デバッグしにくいものです。デバッグ情報は、Cコンパイラがバイナリに埋め込むことができます。ここでは、gccのデバッグ情報に関連するオプションを紹介します。gdbでデバッグするために、gccのデバッグオプションは、-gや-g3、-ggdb などを使用します。

読み方

gcc
じーしーしー
gdb
じーでぃーびー

概要

Cコンパイラの1つであるgccコンパイラには、デバッグ情報に関連するオプションが用意されています。 たとえば、

  • -g
  • -ggdb

などのオプションを見かけたことがあるのではないでしょうか。これらは、デバッグ情報のオプションです。

デバッグ情報のオプション

デバッグ情報のオプションを有効にすると、デバッグ情報が追加されるため、作成されるファイルサイズが大きくなります。 一方で、デバッグがしやすくなる、という効果があります。

-g オプション

-g は、オペレーティングシステムのネイティブフォーマットのデバッグ情報を生成します。gdbは、このデバッグ情報を扱えます。

使い方の例を示します。これで、デバッグ情報を負荷できます。

$ gcc -g main.c

-g オプションのレベル

-g オプションには、レベルを指定できます。gccのマニュアルには、 -glevel といった表記で書かれています。

-g0
レベル0は、デバッグオプションを無効にします。デバッグ情報はバイナリに含まれません。
-g1
レベル1は、最小限の情報を生成します。デバッグするつもりのないプログラムののバックトレースの作成だけで十分な場合に使用します。関数や外部変数、行番号テーブルが含まれます。ローカル変数の情報は含まれません。
-g2
レベル2がデフォルトです。-g オプションと同じ意味になります。
-g3
レベル3は、特別な情報を含みます。プログラム中に存在するすべてのマクロ定義が含まれます。

-ggdb オプション

-gdb オプションは、 gdb で使うためのデバッグ情報を生成します。gdbの拡張形式が使用できる場合は、最も多くの情報を提供する形式を使用します。 -ggdbオプションも -g 同様にレベルが指定できます。

オプションとバイナリサイズ

オプションによってバイナリサイズが変わってくるので試してみました。

コンパイルオプションは、以下の通りです。

gcc5 -std=c11 -Wl,-rpath=/usr/local/lib/gcc5/ -fdiagnostics-color=always main.c -o a.out
gcc5 -std=c11 -Wl,-rpath=/usr/local/lib/gcc5/ -fdiagnostics-color=always -ggdb -g3 main.c -o a.out-gdb-g3
gcc5 -std=c11 -Wl,-rpath=/usr/local/lib/gcc5/ -fdiagnostics-color=always -ggdb -g main.c -o a.out-gdb-g
gcc5 -std=c11 -Wl,-rpath=/usr/local/lib/gcc5/ -fdiagnostics-color=always -ggdb main.c -o a.out-gdb
gcc5 -std=c11 -Wl,-rpath=/usr/local/lib/gcc5/ -fdiagnostics-color=always -g3 main.c -o a.out-g3
gcc5 -std=c11 -Wl,-rpath=/usr/local/lib/gcc5/ -fdiagnostics-color=always -g main.c -o a.out-g

出来たファイルサイズは、以下の通りです。

$ ls -lt a.out*
-rwxr-xr-x  1 kaworu  user   7680  812 23:49 a.out*
-rwxr-xr-x  1 kaworu  user   8944  812 23:49 a.out-g*
-rwxr-xr-x  1 kaworu  user  24264  812 23:49 a.out-g3*
-rwxr-xr-x  1 kaworu  user   8944  812 23:49 a.out-gdb*
-rwxr-xr-x  1 kaworu  user   8944  812 23:49 a.out-gdb-g*
-rwxr-xr-x  1 kaworu  user  24272  812 23:49 a.out-gdb-g3*

ファイルサイズが同じものもありますが、cmp で比較してみると、ちょっとずつ違うようです。 md5でハッシュ値を見ると、それぞれ違うことがわかります。

$ md5 a.out*
MD5 (a.out) = 2eaf2eb4a7c92efcfb4cbe0b8720f0b2
MD5 (a.out-g) = b13d602bed4a6c2a2b1dabfeaf6dc181
MD5 (a.out-g3) = 537e028828569524c77c4befc8a1a62f
MD5 (a.out-gdb) = ac51a2b64580f33f90d1b8f491e22d16
MD5 (a.out-gdb-g) = a68bc66598ee5cf0ceefab15f2b986d3
MD5 (a.out-gdb-g3) = 0bc56a8f399597edc61661791bfeacde

デバッグ情報が読めない場合

gcc5 でコンパイルしたELFファイル を gdb 6.1.1 だとデバッグ情報が読めませんでした。

$ /usr/bin/gdb a.out-g3
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...Dwarf Error: wrong version
in compilation unit header (is 4, should be 2) [in module /a.out-g3]
 
(gdb)

システム標準の gdb だと gcc5 のデバッグ情報が読めないのだと思い、新しい gdb 7.11.1 を入れてみました。

$ /usr/local/bin/gdb a.out-g3
GNU gdb (GDB) 7.11.1 [GDB v7.11.1 for FreeBSD]
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-portbld-freebsd10.1".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out-g3...done.
(gdb)

まとめ

  • デバッグするつもりなら -g3 と -ggdb を設定しておく。
  • ファイルサイズを気にしないなら、とりあえず -g3 -ggdb を設定しておく。
  • デバッグ情報を入れたくないなら -g や -ggdb をつけない

関連項目




スポンサーリンク