当我使用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
-g
和 -ggdb
相似但略有不同,我从这里阅读到:
-g
以操作系统¹原生格式(stabs、COFF、XCOFF 或 DWARF 2)生成调试信息。
-ggdb
生成特别针对 gdb 的调试信息。
-ggdb3
生成额外的调试信息,例如:包括宏定义。不带级别参数的
-ggdb
默认为-ggdb2
(即 level 2 对应 gdb)。
我至少有一个例子,其中-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)
"-g"是便于移植的选项(例如,在预定在非GNU平台上执行的Makefile中)。最近我在AIX机器上遇到了关于-g与-ggdb的可移植性问题,这就是为什么我提出它的原因。
但是对于-ggdb增强了哪些方面的可用性我不清楚。