Pergunta

Ao escrever código C / C ++, para depurar o executável a opção de depuração binário deve ser activado no compilador / vinculador. No caso do GCC, a opção é -g. Quando a opção de depuração está habilitado, como o afetam o binário executável? O que dados adicionais são armazenados no arquivo que permite a função depurador como faz?

Foi útil?

Solução

-g diz ao compilador para armazenamento de símbolo informações da tabela no executável. Entre outras coisas, isso inclui:

  • nomes de símbolo
  • info tipo para símbolos
  • arquivos e números de linha onde os símbolos vieram

Os depuradores usar esta informação para saída de nomes significativos para símbolos e às instruções associadas com determinadas linhas na fonte.

Para alguns compiladores, fornecendo -g irá desativar algumas otimizações. Por exemplo, o ICC define o nível de otimização padrão para -O0 com -g menos que você indique explicitamente -O [123]. Além disso, mesmo se você fizer oferta -O [123], otimizações que impedem o rastreamento de pilha ainda será desativado (por exemplo tirando ponteiros do quadro de quadros de pilha. Isto tem apenas um pequeno efeito no desempenho).

Com alguns compiladores, -g irá desativar otimizações que podem confundir onde os símbolos veio (reordenação instrução, desdobramento de loop, inlining etc). Se você deseja depurar com a otimização, você pode usar G3 com gcc para contornar um pouco isso. Informação extra de depuração será incluído sobre macros, expansões, e funções que podem ter sido inlined. Isso pode permitir que depuradores e ferramentas de desempenho para mapear o código otimizado para a fonte original, mas é melhor esforço. Algumas otimizações realmente mangle o código.

Para mais informações, dê uma olhada ANÃO, o formato de depuração originalmente concebido para ir junto com ELF (o formato binário para Linux e outros sistemas operacionais de).

Outras dicas

A tabela de símbolos é adicionado ao executável que mapeia função / variável nomes para locais de dados, de modo que os depuradores podem relatar informações de volta significativo, ao invés de ponteiros apenas. Isso não afeta a velocidade do seu programa, e você pode remover a tabela de símbolos com o comando 'strip'.

Além da depuração e símbolo de informação
Google ANÃO (A piada Developer em ELF)

Por padrão a maioria das otimizações do compilador são desligados quando a depuração está habilitado.
Assim, o código é a tradução pura da fonte em código de máquina e não o resultado de muitas transformações altamente especializados que são aplicadas aos binários de lançamento.

Mas a diferença mais importante (na minha opinião)
Memória em compilações de depuração normalmente é inicializado para alguns valores compilador específicas para facilitar a depuração. Nas compilações de memória não for inicializado a menos que explicitamente feito pelo código do aplicativo.

Verifique a documentação do compilador para obter mais informações:
Mas um exemplo para DevStudio é:

  • 0xCDCDCDCD atribuídos na pilha, mas não inicializada
  • 0xDDDDDDDD Lançado memória heap.
  • 0xFDFDFDFD "Nomansland" cercas automaticamente colocado no limite da memória heap. nunca deve ser substituído. Se você fizer um de substituição, provavelmente você está andando fora da extremidade de uma matriz.
  • 0xCCCCCCCC atribuídos na pilha, mas não inicializada

-g adiciona informação de depuração no executável, como os nomes de variáveis, os nomes de funções e números de linha. Isso permite que um depurador, tais como o GDB passo através código linha por linha, pontos de interrupção conjunto, e inspeccionar os valores das variáveis. Por causa desta informação adicional usando aumenta -g o tamanho do executável.

Além disso, gcc permite usar -g juntamente com -O bandeiras, que se transformam em otimização. Depurar um executável otimizado pode ser muito complicado, porque as variáveis ??podem ser otimizados de distância, ou instruções podem ser executadas em uma ordem diferente. Geralmente, é uma boa idéia para desligar otimização ao utilizar -g, mesmo que resulta em código muito mais lento.

Há alguma sobreposição com este questão que abrange a questão do outro lado.

Assim como uma questão de interesse, você pode se abrir um editor hexadecimal e dar uma olhada em um executável produzido com -g e um sem. Você pode ver os símbolos e as coisas que são adicionados. Pode mudar o conjunto (-S) também, mas eu não tenho certeza.

Alguns sistemas operacionais (como z / OS ) produzem um "arquivo de lado" que contém os símbolos de depuração. Isso ajuda a evitar o inchaço do executável com a informação extra.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top