当我使用gcc编译C程序时,我通常会使用-g
一些调试信息到elf文件中,以便gdb可以在需要时帮助我.
但是,我注意到有些程序使用-ggdb
,因为它应该使调试信息更友好.
它们有何不同,建议使用哪些?
注意:指向调试程序或GCC的选项的链接,http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
-g
并且-ggdb
几乎相似但略有不同,我在这里读到:
-g以OS¹本机格式(stabs,COFF,XCOFF或DWARF 2)生成调试信息.
-ggdb生成专门用于gdb的调试信息.
-ggdb3生成额外的调试信息,例如:包括宏定义.-ggdb本身没有指定级别默认值
-ggdb2(即2级的gdb).
可能没有区别 - 取决于操作系统本机格式以及您希望调试信息的可移植性.请参阅GCC手册" 调试选项".
我至少有一个例子,其中-ggdb对我来说比我们使用的另一个调试选项更好:
amitkar@lohgad:~> cat > main.c #includeint 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 +,新版本的调试器也能正常工作
有一点是"-g"是可移植的(例如,Makefiles注定要在非GNU平台上执行).我最近在AIX机器上遇到了关于-g与-ggdb的可移植性问题,这就是我提出它的原因.
但是不知道-ggdb在可用性方面增加了什么.