Question

En utilisant la trace, je trouve que quelques fonctions ne sont pas répertoriés dans la source tout en essayant de les trouver afin de mettre un point d'arrêt. Ces fonctions semble apparaître que lorsque je considère la source au format d'assemblage.

J'ai parlé à mes aînés, on m'a dit que si une fonction est appelée une seule fois, il sera optimisé par Trace et apparaîtra en ligne, peut donc être vu dans l'assemblage.

Mes questions sont les suivantes:

  1. Comment fonctionne cette optimisation passe par Lauterbach?
  2. Est-ce avantageux ??
Était-ce utile?

La solution

Il y a deux choses:

  1. En ce qui concerne la déclaration Je trouve que quelques fonctions ne sont pas répertoriés dans la source tout en essayant de les trouver afin de mettre un des points d'arrêt », il suffit de cocher la fichier de mappage / fichier de la carte qui se compose des différentes fonctions qui ont été utilisées dans la construction, leur emplacement en mémoire etc et si vous faites là-bas que il suffit de regarder trouvez pas votre fonction là dans l'optimisation [seulement qui pourrait être la question].

  2. Comme l'a justement souligné, l'optimisation ne se fait pas par le Lauterbach, mais il se fait par le compilateur. Normalement, il y a différents niveaux d'optimisation [en ARM, nous avons O0-O2] où O0 est l'optimisation la plus élevée possible, mais cela ne devrait être utilisée quand il y a un communiqué au client autre niveau d'optimisation O2 doit être utilisé pour le débogage.

  3. Si vous vous sentez la fonction peut être optimisé par le compilateur, essayez de rendre volatile .

  4. Autre point qui pourrait ne pas être [directement] lié à cela, mais pourrait aider est de savoir « dans quelle zone de la mémoire est votre fichier situé » depuis de nombreuses fois, quand vous voulez déboguer quelque chose et que la page est toujours pas dans la RAM, vous ne serez pas en mesure de mettre les points d'arrêt jusqu'au moment où cette page est prise dans la RAM [en gros, quelque chose comme on-Demand Paging si elle est présente dans votre système]

Hope this helps.

-hjsblogger

Autres conseils

L'optimisation se fait par le compilateur, et non par le Lauterbach. Le compilateur essaie d'optimiser sa production en langage assembleur et les paramètres par défaut généralement inline fonctions qui sont appelées seulement une fois.

Pour remplacer ces optimisations à des fins de test, vous pouvez utiliser le drapeau du compilateur -. No_inline

Inlining une fonction qui n'est appelée une fois peut être fait par le compilateur.

L'avantage est qu'il permet d'économiser les frais généraux d'un appel de fonction (exécution, l'espace de code et de l'espace de pile), et vous pouvez toujours écrire le code d'une manière modulaire agréable que plusieurs fonctions.

L'inconvénient est que le débogage devient plus difficile, parce que pendant la fonction de débogage est mélangé avec l'appelant.

W.r.t. le comportement de votre outil de trace votre question est assez claire.

S'il y a une fonction appelée que vous ne pouvez pas trouver dans votre code source il est peu probable d'être en raison des fonctions inline pour 2 raisons:

  1. appels de fonction inline ne sera pas affiché comme l'appelle sous-routine dans le code assembleur - le code pour implémenter la fonction est émise en ligne au point où l'appel de fonction serait par ailleurs (c'est ce que inline est)

  2. lorsque le compilateur inline votre fonction appelle, le nom de la fonction (si vous pouvez le voir dans la sortie de l'assemblage) serait encore partie de votre code source -. C'est où le compilateur serait de mettre le code en ligne

Mais, compilateurs fonction insérer parfois mystérieux appels à des fonctions d'assistance interne dans le code généré pour mettre en œuvre des choses comme des opérations arithmétiques que le CPU ne supporte pas directement (opérations de division entière ou à virgule flottante par exemple).

Quels sont les noms des « fonctions mystère »?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top