2009-03-21 2 views
62

Когда я использую GCC для компиляции программ C Я обычно использую -g, чтобы получить некоторую отладочную информацию в файл эльфа так что GDB может мне помочь в случае необходимости.В чем разница между GCC -ggdb и GCC -g

Однако, я заметил, что некоторые программы используют -ggdb, так как предполагается, что отладочная информация больше gdb.

Как они отличаются и которые рекомендуется использовать?


Примечание: Ссылка на варианты отладки вашей программы или GCC, http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

ответ

27

Возможно, что нет никакой разницы - зависит от собственного формата ОС и от того, насколько портативна информация об отладке. См. Руководство GCC Debugging Options.

5

Одно дело, что «-g» является портативным (например, в Makefiles предназначенных для выполнения на не-GNU платформ). Недавно у меня была проблема с переносимостью относительно -g против -ggdb на машине AIX, поэтому я ее подниму.

Не знаю, что -ggdb добавляет в удобство использования.

9

У меня есть по крайней мере один пример, где -ggdb работал лучше для меня, чем другой вариант отладки, который мы использовали:

[email protected]:~> 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; 
} 
[email protected]:~> gcc -gstabs+ main.c -o main 

[email protected]:~> 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 
[email protected]:~> /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 +

35

-g и -ggdb почти одинаковы с некоторыми незначительными различия, я прочитал эту here:

-g производит отладочную информацию в родном формате OS¹s (уколов, COFF, XCOFF или DWARF 2).

-ggdb производит отладочную информацию, специально предназначенную для gdb.

-ggdb3 создает дополнительную информацию для отладки, например: в том числе определения макросов. -ggdb сам по себе без указания уровня по умолчанию

-ggdb2 (то есть, gdb для уровня 2).