gcc -ggdb和gcc -g有什么区别


90

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

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

它们有何不同?建议使用哪种?


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

Answers:



60

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

-g 以OS的本机格式(刺,COFF,XCOFF或DWARF 2)生成调试信息。

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

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

-ggdb本身而不指定级别默认值-ggdb2(即,对于级别2为gdb)。


12

我至少有一个示例,其中-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 +,也可以使用较新版本的调试器


7

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

但是,不知道-ggdb会增加什么可用性。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.