Когда я использую gcc для компиляции программ на C, я обычно использую -g
для получения некоторой отладочной информации в файл elf, чтобы gdb мог мне помочь в случае необходимости.
Однако я заметил, что некоторые программы используют -ggdb
, поскольку это должно сделать информацию отладки более удобной для gdb.
Чем они отличаются и что рекомендуется использовать?
Примечание. Ссылка на параметры отладки вашей программы или GCC, http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
-g
и-ggdb
похожи с некоторыми небольшими отличиями, я прочитал это здесь :источник
У меня есть по крайней мере один пример, когда -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 +
источник
Во-первых, "-g" переносим (например, в Make-файлах, предназначенных для выполнения на платформах, отличных от GNU). Недавно у меня возникла проблема с переносимостью -g по сравнению с -ggdb на машине AIX, поэтому я поднимаю ее.
Однако не знаю, что -ggdb добавляет в удобство использования.
источник
Это официальное объяснение: http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options
Только несколько неопровержимых фактов, но все равно интересно.
источник