Gccを使用してCプログラムをコンパイルするときは、通常-g
を使用して、必要に応じてgdbが役立つように、elfファイルにデバッグ情報を取得します。
ただし、一部のプログラムでは-ggdb
を使用していることに気付きました。これは、デバッグ情報をよりgdbフレンドリーにするためのものだからです。
それらはどのように異なり、どちらを使用することが推奨されますか?
注:プログラムまたはGCCをデバッグするためのオプションへのリンク http://gcc.gnu.org/onlinedocs/gcc/ Debugging-Options.html#Debugging-Options
違いがない可能性があります-OSのネイティブ形式とデバッグ情報の移植性に依存します。 GCCのマニュアル デバッグオプション を参照してください。
-g
および-ggdb
は、いくつかのわずかな違いでほぼ類似しています。これを読みます here :
-gは、OS¹のネイティブ形式(スタブ、COFF、XCOFF、またはDWARF 2)でデバッグ情報を生成します。
-ggdbは、gdb専用のデバッグ情報を生成します。
-ggdb3は、たとえばマクロ定義を含む追加のデバッグ情報を生成します。レベルをデフォルトに指定せずに-ggdb単独で
-ggdb2(つまり、レベル2のgdb)。
私が使用していた別のデバッグオプションよりも-ggdbの方がうまく機能した例が少なくとも1つあります。
amitkar@lohgad:~> cat > main.c
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Args :%d\n", argc);
for ( ;argc > 0;)
printf("%s\n", argv[--argc]);
return 0;
}
amitkar@lohgad:~> gcc -gstabs+ main.c -o main
amitkar@lohgad:~> file main
main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped
amitkar@lohgad:~> /usr/bin/gdb ./main
GNU gdb 6.6.50.20070726-cvs
Copyright (C) 2007 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 "x86_64-suse-linux"...
Using Host libthread_db library "/lib64/libthread_db.so.1".
(gdb) break main
Breakpoint 1 at 0x400577: file main.c, line 5.
(gdb) run
Starting program: /home/amitkar/main
Breakpoint 1, main (argc=Cannot access memory at address 0x8000df37d57c
) at main.c:5
5 printf("Args :%d\n", argc);
(gdb) print argc
Cannot access memory at address 0x8000df37d57c
(gdb)
注:これはx86-64ボックスでのみ発生し、-ggdbでコンパイルすると消えます。しかし、デバッガの新しいバージョンは-gstabs +を使用しても機能します
一つのことは、「-g」は移植性があるということです(例えば、GNU以外のプラットフォームで実行される予定のMakefileで)。最近、AIXマシンで-gと-ggdbに関して移植性の問題が発生しました。そのため、これを取り上げました。
ただし、-ggdbがユーザビリティに何を追加するのかはわかりません。
これは公式の説明です: http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
確かな事実はほとんどありませんが、とにかく興味深いです。