gdbでデバッグするためのgccのデバッグ情報のオプション
gdb でデバッグするときに必要になるのがデバッグ情報です。デバッグ情報がないと、デバッグしにくいものです。デバッグ情報は、Cコンパイラがバイナリに埋め込むことができます。ここでは、gccのデバッグ情報に関連するオプションを紹介します。デバッグオプションは、-gや-g3、-ggdbなどを使用します。
読み方
目次
概要
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 8月 12 23:49 a.out* -rwxr-xr-x 1 kaworu user 8944 8月 12 23:49 a.out-g* -rwxr-xr-x 1 kaworu user 24264 8月 12 23:49 a.out-g3* -rwxr-xr-x 1 kaworu user 8944 8月 12 23:49 a.out-gdb* -rwxr-xr-x 1 kaworu user 8944 8月 12 23:49 a.out-gdb-g* -rwxr-xr-x 1 kaworu user 24272 8月 12 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 をつけない
関連項目
ツイート