110

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

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

它们有何不同,推荐使用哪个?


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

4

5 回答 5

78

-g并且-ggdb相似但有一些细微差别,我在这里读到:

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

-ggdb生成专门用于 gdb 的调试信息。

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

-ggdb本身没有指定级别默认为-ggdb2(即,gdb 为级别 2)。

于 2013-02-11T11:58:41.337 回答
42

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

于 2009-03-21T08:40:37.550 回答
13

我至少有一个例子,其中 -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+,较新版本的调试器也能正常工作

于 2009-07-09T20:54:00.410 回答
9

一件事是“-g”是可移植的(例如在注定要在非GNU平台上执行的Makefile中)。我最近在 AIX 机器上遇到了关于 -g 与 -ggdb 的可移植性问题,这就是我提出它的原因。

不过,不知道 -ggdb 在可用性方面增加了什么。

于 2009-03-21T08:17:38.103 回答
5

这是官方的解释: http: //gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

只有几个确凿的事实,但无论如何都很有趣。

于 2011-02-25T21:29:20.233 回答