当我使用gcc编译C程序时,我通常会使用-g
一些调试信息到elf文件中,以便gdb可以在需要时帮助我.
但是,我注意到有些程序使用-ggdb
,因为它应该使调试信息更友好.
它们有何不同,建议使用哪些?
注意:指向调试程序或GCC的选项的链接,http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
小智 10
我至少有一个例子,其中-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)
Run Code Online (Sandbox Code Playgroud)
注意:这仅在x86-64框上发生,并在使用-ggdb编译时消失.但是,即使使用-gstabs +,新版本的调试器也能正常工作
有一点是"-g"是可移植的(例如,Makefiles注定要在非GNU平台上执行).我最近在AIX机器上遇到了关于-g与-ggdb的可移植性问题,这就是我提出它的原因.
但是不知道-ggdb在可用性方面增加了什么.
这是官方解释: http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
只有一些确凿的事实,但无论如何都很有趣。