【问题标题】:What is the difference between gcc -ggdb and gcc -ggcc -ggdb 和 gcc -g 有什么区别
【发布时间】:2010-10-14 17:08:34
【问题描述】:

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

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

它们有何不同?推荐使用哪一种?


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

【问题讨论】:

    标签: gcc gdb


    【解决方案1】:

    -g-ggdb 相似,但有一些轻微 不同,我读到了here

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        不过,不知道 -ggdb 增加了哪些可用性。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-16
            • 2017-07-16
            • 2010-09-15
            相关资源
            最近更新 更多