Lors de l'utilisation de perf report
, je ne vois aucun symbole pour mon programme, mais la sortie est comme ceci:
$ perf record /path/to/racket ints.rkt 10000
$ perf report --stdio
# Overhead Command Shared Object Symbol
# ........ ........ ................. ......
#
70.06% ints.rkt [unknown] [.] 0x5f99b8
26.28% ints.rkt [kernel.kallsyms] [k] 0xffffffff8103d0ca
3.66% ints.rkt perf-32046.map [.] 0x7f1d9be46650
Ce qui est assez peu informatif.
Le programme approprié est construit avec des symboles de débogage, et l'outil sysprof
affiche les symboles appropriés, tout comme Zoom, qui utilise je pense perf
sous le capot.
Notez que ceci est sur x86-64, donc le binaire est compilé avec -fomit-frame-pointer
, mais c'est le cas également lorsque vous utilisez les autres outils.
Cet article a déjà plus d'un an, mais comme il figurait en haut de mes résultats de recherche Google alors que j'avais le même problème, j'ai pensé y répondre ici. Après quelques recherches supplémentaires, j’ai trouvé la réponse donnée dans cette question StackOverflow très utile. Sur mon système Ubuntu Raring, j'ai fini par faire ce qui suit:
-g
(assez évident, vous avez besoin de symboles de débogage)Exécutez perf
comme
record -g dwarf -F 97 /path/to/my/program
De cette façon, perf
est capable de gérer le format de débogage DWARF 2 , qui est le format standard que gcc
utilise sous Linux. Le paramètre -F 97
réduit le taux d'échantillonnage à 97 Hz. Le taux d'échantillonnage par défaut était apparemment trop élevé pour mon système et donnait lieu à des messages tels que:
Warning:
Processed 172390 events and lost 126 chunks!
Check IO/CPU overload!
et l'appel perf report
après échouerait avec une erreur de segmentation. Avec le taux d'échantillonnage réduit, tout s'est bien passé.
perf.data
a été généré sans erreur à l'étape précédente, vous pouvez exécuter perf report
etc. J'aime personnellement les outils FlameGraph pour générer des visualisations SVG.D'autres personnes ont signalé que courir
echo 0 > /proc/sys/kernel/kptr_restrict
en tant que root peut également aider si des symboles du noyau sont requis.
Dans mon cas, la solution consistait à supprimer les fichiers elf contenant les symboles mis en cache des versions précédentes et qui posaient problème.
Ils sont dans le dossier ~/.debug /
Assurez-vous de compiler le programme à l'aide de l'option -g avec gcc (cc) afin que les informations de débogage soient générées au format natif du système d'exploitation . Essayez de procéder comme suit et vérifiez si des symboles de débogage sont présents dans la table des symboles .
$objdump -t your-elf
$readelf -a your-elf
$nm -a your-elf
Que diriez-vous de votre machine hôte dev? Exécute-t-il également le système d'exploitation x86_64?.
Vous pouvez toujours utiliser la commande '$ nm'.
voici quelques exemples de sortie:
Ethans-MacBook-Pro:~ phyrrus9$ nm a.out
0000000100000000 T __mh_execute_header
0000000100000f30 T _main
U _printf
0000000100000f00 T _sigint
U _signal
U dyld_stub_binder
vous pouvez vérifier la valeur de kptr_restrict par cat /proc/kallsyms
. Si les adresses des symboles dans le résultat sont toutes 0x000000, vous pouvez y remédier à l'aide de la commande echo 0 > sys/kernel/kptr_restrict
. Après cela, vous pouvez obtenir un résultat recherché du perf report
J'ai eu ce problème aussi, je ne pouvais voir aucun symbole de l'espace utilisateur, mais j'ai vu des symboles du noyau. Je pensais que c'était un problème de chargement de symbole. Après avoir essayé toutes les solutions possibles que je pouvais trouver, je ne pouvais toujours pas le faire fonctionner.
Puis je me souviens vaguement que
ulimit -u illimité
est nécessaire. J'ai essayé et cela a fonctionné comme par magie.
J'ai trouvé sur ce wiki que cette commande est nécessaire lorsque vous utilisez trop de descripteurs de fichiers.
https://perf.wiki.kernel.org/index.php/Tutorial#Troubleshooting_and_Tips
ma dernière commande était
record de performance -F 999 -g ./mon_programme
pas besoin de --call-graph
J'ai eu le même problème avec perf après avoir ignoré le nom de mon programme via prctl(PR_SET_NAME)
Comme je peux voir, votre cas est assez similaire:
70.06% ints.rkt [inconnu]
La commande que vous avez exécutée (racket) est différente de celle que perf a vue.