GCC -g vs -g3 Sinalizador GDB: Qual é a diferença?
Ao compilar o código-fonte C com gcc ou Clang, sempre uso o -g sinalizador para gerar informações de depuração para gdb.
Percebi que algumas pessoas recomendam em -g3vez disso. Qual é a diferença entre os sinalizadores -ge -g3? Também há uma diferença entre -ge -ggdb?
Eu vim aqui porque estou usando o makefile de outra pessoa, e a documentação é uma besta para começar. Boa pergunta para ter no StackOverflow para encontrar uma resposta fácil do google.
Um número esmagador de perguntas sobre o SO é "coberto por minha documentação", desde que você esteja disposto a investigar o suficiente. Essa não é uma razão válida para descartar uma pergunta.
Produza informações de depuração no formato nativo do sistema operacional (stabs, COFF, XCOFF ou DWARF 2). O GDB pode trabalhar com essas informações de depuração. Na maioria dos sistemas que usam o formato stabs, -g permite o uso de informações de depuração extras que apenas o GDB pode usar; esta informação extra faz com que a depuração funcione melhor no GDB, mas provavelmente faz com que outros depuradores travem ou se recusem a ler o programa. Se você deseja controlar com certeza se deve gerar as informações extras, use -gstabs +, -gstabs, -gxcoff +, -gxcoff ou -gvms (veja abaixo).
Produza informações de depuração para uso pelo GDB. Isso significa usar o formato mais expressivo disponível (DWARF 2, stabs ou o formato nativo se nenhum deles for compatível), incluindo extensões GDB, se possível.
Solicite informações de depuração e também use o nível para especificar a quantidade de informações. O nível padrão é 2. O nível 0 não produz nenhuma informação de depuração. Assim, -g0 nega -g.
O nível 3 inclui informações extras, como todas as definições de macro presentes no programa. Alguns depuradores suportam expansão de macro quando você usa -g3.
É possível explicar ainda qual é a diferença entre por exemplo "formato mais expressivo" e "informação extra"? Esses parâmetros são complementares? Muitos deles mencionam GDB ... Obrigado!
tl; dr: Para responder à sua pergunta específica, -g3"inclui informações extras, como definições de macro ... Alguns depuradores oferecem suporte à expansão de macro quando você usa -g3", embora -gnão inclua essas informações extras.
A resposta mais ampla é que o gcc suporta quatro níveis de informações de depuração, de -g0(informações de depuração desabilitadas) a -g3(informações de depuração máximas).
Especificar -gé equivalente a -g2. Curiosamente, os documentos do gcc dizem pouco sobre quais informações -g/ -g2incluem ou excluem:
O nível 1 produz informações mínimas, o suficiente para fazer backtraces em partes do programa que você não planeja depurar. Isso inclui descrições de funções e variáveis ​​externas e tabelas de número de linha, mas nenhuma informação sobre variáveis ​​locais.