Depuração usando Lauterbach (Trace32)
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:
- Como é que essa otimização acontece através de Lauterbach?
- Isto é vantajoso ??
Solução
Há um par de coisas:
-
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].
-
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.
-
Se você sentir a função pode ser otimizado pelo compilador, tentar torná-lo volátil .
-
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:
-
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 é)
-
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'?