2015-09-09 2 views
0

J'ai profilé une application en utilisant perf, et je suis confus pourquoi les noms des fonctions sont si mutilés dans le rapport. Par exemple, voici la sortie de perf report:noms de fonction de rapport de perfusion et caractères supplémentaires

# Overhead  Command  Shared Object                         
# ........ ........... ................. ................................................................................................................................................................................................. 
# 
    38.98% hello_sp_tp libc-2.19.so  [.] __memcpy_sse2_unaligned                                          
      | 
      --- __memcpy_sse2_unaligned 
       |   
       |--21.70%-- _ZN5nupic10algorithms6Cells46CStateaSERKS2_.local.1629 
       |   
       --17.28%-- _ZN5nupic10algorithms6Cells46Cells420updateInferenceStateERKSt6vectorIjSaIjEE 
          _ZN5nupic10algorithms6Cells46Cells47computeEPfS3_bb 

Par exemple, je reconnais le nom nupic.algorithms.Cells4.updateInferenceState(), mais je ne suis pas sûr de ce que tous les autres personnages que rembourrer les noms signifient.

Qu'est-ce que _ZN5? Qu'est-ce que IjSaIjEE à la fin de ce nom de fonction? Qu'est-ce que cela signifie? D'où viennent-ils?

Répondre

1

Ces noms (fonctions C++) sont mutilés. Regardez name mangling pour les détails de la syntaxe. Cela permet d'encoder des noms C++ complexes. A propos de votre rapport de perf, il existe des options à demander pour démembrer: --demangle qui est théoriquement défini par défaut mais une implémentation réelle peut dépendre de la version perf ou de l'architecture de votre CPU.

+0

Oui, j'étais confus par cela parce que j'appris de l'homme que 'la page perf --demangle' est réglé par défaut, je voyais encore le nom mangling. Y at-il des options que je dois définir pour GCC pour faciliter le démantèlement de nom? – mateja

+1

@mateja Il n'y a rien à faire au niveau du GCC. Le démanglement est fait par perf. Je ne vois pas de raison visible directe pour laquelle cela pourrait dépendre de l'arche mais j'ai vu un bug démêlant sur ARM64. Si vous voulez vraiment démêler sans réparer perf, vous pouvez écrire un script pour post-traiter le rapport, même si ce n'est pas très pratique. Le script pourrait appeler 'C++ filt' qui est une commande capable de traduire, par exemple' C++ filt_ZN5nupic10algorithms6Cells46Cells47computeEPfS3_bb' donnera 'nupic :: algorithms :: Cells4 :: Cells4 :: compute (float *, float *, booléen , booléen) – amigadev