当我使用gcc编译C程序时,通常会使用-g
一些调试信息到elf文件中,以便gdb在需要时可以为我提供帮助。
但是,我注意到有些程序使用-ggdb
,因为它应该使调试信息更加友好gdb。
它们有何不同?建议使用哪种?
注:链接的选项,调试程序或GCC,http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
当我使用gcc编译C程序时,通常会使用-g
一些调试信息到elf文件中,以便gdb在需要时可以为我提供帮助。
但是,我注意到有些程序使用-ggdb
,因为它应该使调试信息更加友好gdb。
它们有何不同?建议使用哪种?
注:链接的选项,调试程序或GCC,http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
Answers:
我至少有一个示例,其中-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 +,也可以使用较新版本的调试器
这是官方说明:http : //gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
只有很少的事实,但仍然很有趣。