当我使用gcc编译C程序时
我通常使用-g
将一些调试信息输入到elf文件中
所以如果需要,gdb可以帮助我。
但是,我注意到有些程序使用-ggdb
,因为它应该使用{{1}}
调试信息更多gdb友好。
它们有何不同,建议使用哪些?
注意:指向调试程序或GCC的选项的链接http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
答案 0 :(得分:44)
-g
和-ggdb
与轻微的差异几乎相似,我读了here:
-g以OS¹本机格式(stabs,COFF,XCOFF或DWARF 2)生成调试信息。
-ggdb生成专门用于gdb的调试信息。
-ggdb3生成额外的调试信息,例如:包括宏定义。 -ggdb本身没有指定级别 默认为
-ggdb2(即第2级的gdb)。
答案 1 :(得分:29)
可能没有区别 - 取决于操作系统本机格式以及您希望调试信息的可移植性。请参阅GCC手册Debugging Options。
答案 2 :(得分:9)
我至少有一个例子,其中-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 +
答案 3 :(得分:5)
有一件事是“-g”是可移植的(例如在Makefiles中注定要在非GNU平台上执行)。我最近在AIX机器上遇到了关于-g与-ggdb的可移植性问题,这就是我提出它的原因。
不知道-ggdb在可用性方面增加了什么。
答案 4 :(得分:3)
这是官方解释: http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
只有少数事实,但无论如何都很有趣。