Pergunta

Enquanto estiver usando traço, descobri que algumas funções não estão listados na fonte durante a tentativa de encontrá-los, a fim de colocar um ponto de interrupção. Estas funções parece só aparecem quando eu ver a fonte em formato de montagem.

Eu falei com meus superiores, eles me disse que se qualquer função só é chamado uma vez, ele será otimizado pelo rastreamento e aparecerá como inline, portanto, pode ser visto na montagem.

As minhas perguntas são:

  1. Como é que essa otimização acontece através de Lauterbach?
  2. Isto é vantajoso ??
Foi útil?

Solução

Há um par de coisas:

  1. Em relação à declaração Descobri que algumas funções não estão listados na fonte durante a tentativa de encontrá-los, a fim de colocar pontos de interrupção ", basta verificar o arquivo de mapeamento / arquivo do mapa que consiste nas diferentes funções que foram utilizados na construção, as suas posições na memória etc e se você não encontrar sua função lá lá do que olhar apenas para a otimização [Só que poderia ser o problema].

  2. Como justamente salientou, a otimização não é feito pela Lauterbach, mas é feito pelo compilador. Normalmente, existem diferentes níveis de otimização [em ARM temos O0-O2] onde O0 é o maior otimização possível, mas isso só deve ser usado quando há uma libertação para o O2 cliente pessoa nível de otimização deve ser usado para depuração.

  3. Se você sentir a função pode ser otimizado pelo compilador, tentar torná-lo volátil .

  4. Outro ponto que pode não ser [diretamente] relacionado a este, mas pode ajudar é saber "Em que área da memória é o seu arquivo localizado" já que muitas vezes, quando você deseja depurar algo e essa página é ainda não na RAM, você não será capaz de colocar os pontos de interrupção até o momento que a página é tomado na RAM [Basicamente, algo como paginação On-Demand se ele estiver presente em seu sistema]

Espero que isso ajude.

-hjsblogger

Outras dicas

A otimização é feito pelo compilador, não pelo Lauterbach. As tentativas de compilação para otimizar sua produção linguagem assembly, e as configurações padrão normalmente vai funções inline que são chamados apenas uma vez.

Para substituir essas otimizações para fins de teste, você pode usar o sinalizador do compilador -. No_inline

Inlining uma função que só é chamado uma vez pode ser feito pelo compilador.

A vantagem é que ele salva a sobrecarga de uma chamada de função (tempo de execução, o espaço de código e espaço de pilha), e você ainda pode escrever o código de uma forma modular agradável como várias funções.

A desvantagem é que a depuração se torna mais difícil, porque durante a função de depuração é misturado com o chamador.

W.r.t. o comportamento de sua ferramenta de rastreamento sua pergunta é bastante clara.

Se há uma função que está sendo chamado de que você não pode encontrar em seu código-fonte, é pouco provável que seja por causa das funções inlined por 2 motivos:

  1. chamadas de funções inlined não vai aparecer como chamadas de sub-rotinas no código de montagem - o código para implementar a função é emitido em linha no ponto onde a chamada de função seria de outra maneira (que é o que inlining é)

  2. quando o compilador inlines suas chamadas de função, o nome da função (se você pudesse vê-lo na saída de montagem) ainda seria parte de seu código-fonte -. Que é onde o compilador estaria recebendo o código de linha

Mas, compiladores, por vezes inserir chamadas de função misteriosa para funções auxiliares interno para o código gerado para implementar coisas como operações aritméticas que a CPU não suporta diretamente (divisão inteira ou operações de ponto flutuante por exemplo).

O que são os nomes das 'funções de mistério'?

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