gcc -ggdb和gcc -g之间有什么区别?

123

当我使用gcc编译C程序时,通常使用-g将一些调试信息放入elf文件中,以便在需要时gdb可以帮助我。

然而,我注意到有些程序使用-ggdb,因为它应该使调试信息更加gdb友好。

它们有什么区别,哪一个推荐使用?


注意:关于调试您的程序或GCC的选项的链接,http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

5个回答

93

-g-ggdb 相似但略有不同,我从这里阅读到:

-g 以操作系统¹原生格式(stabs、COFF、XCOFF 或 DWARF 2)生成调试信息。

-ggdb 生成特别针对 gdb 的调试信息。

-ggdb3 生成额外的调试信息,例如:包括宏定义。

不带级别参数的 -ggdb 默认为 -ggdb2(即 level 2 对应 gdb)。


43

可能没有区别 - 取决于操作系统的本地格式和您希望调试信息的可移植性。请参阅GCC手册《调试选项》


1
是否考虑将当前链接作为此链接的替代? - 1737973

14

我至少有一个例子,其中-ggdb对我比我们使用的另一种调试选项更有效:

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+也可以正常工作。

10

"-g"是便于移植的选项(例如,在预定在非GNU平台上执行的Makefile中)。最近我在AIX机器上遇到了关于-g与-ggdb的可移植性问题,这就是为什么我提出它的原因。

但是对于-ggdb增强了哪些方面的可用性我不清楚。


5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接