Lorsque vous utilisez le perf report
, je ne vois aucun symbole pour mon programme, mais je reçois un résultat 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 peu informatif.
Le programme correspondant est construit avec des symboles de débogage, et l’outil sysprof
affiche les symboles appropriés, tout comme Zoom, qui, selon moi, utilise la perf
sous le capot.
Notez que ceci est sur x86-64, donc le binary est compilé avec -fomit-frame-pointer
, mais c’est le cas lorsque vous utilisez également les autres outils.
Cet article date déjà de plus d’un an, mais depuis que j’ai eu le même problème en haut de mes résultats de recherche Google, je pensais pouvoir y répondre ici. Après quelques recherches, j’ai trouvé la réponse donnée dans cette question StackOverflow très utile. Sur mon système Ubuntu Raring, j’ai ensuite fait ce qui suit:
-g
(assez évident, vous avez besoin de symboles de débogage) Exécuter 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 utilisé par gcc
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 entraînait des messages comme celui-ci:
Warning: Processed 172390 events and lost 126 chunks! Check IO/CPU overload!
et l’appel de perf report
échouerait ensuite avec un défaut 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 le perf report
etc. J’aime les outils FlameGraph pour générer des visualisations SVG. D’autres personnes ont signalé que courir
echo 0 > /proc/sys/kernel/kptr_ressortingct
en tant que root peut aussi aider si les symboles du kernel sont requirejs.
Dans mon cas, la solution consistait à supprimer les fichiers elf qui contenaient des symboles mis en cache dans les versions précédentes et qui étaient gênants.
Ils sont dans le dossier ~ / .debug /
Que diriez-vous de votre machine hôte dev? Est-ce que le système d’exploitation x86_64 fonctionne également? Si ce n’est pas le cas, assurez-vous que le perf est compilé de manière croisée, car le perf dépend de objdump et d’autres outils de la chaîne d’outils.
Assurez-vous de comstackr le programme en utilisant l’option -g avec gcc (cc) pour que les informations de débogage soient produites dans le format natif du système d’exploitation. Essayez d’effectuer les opérations suivantes et vérifiez s’il existe des symboles de débogage dans la table des symboles.
$objdump -t your-elf $readelf -a your-elf $nm -a your-elf
Vous pouvez toujours utiliser la commande ‘$ nm’.
voici un exemple 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
J’ai eu le même problème avec perf après avoir remplacé 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 (la raquette ) est différente de celle que vous avez vue.
Vous pouvez vérifier la valeur de kptr_ressortingct par cat /proc/kallsyms
. Si les adresses des symboles dans le résultat sont toutes 0x000000, vous pouvez le réparer par la commande echo 0 > sys/kernel/kptr_ressortingct
. Après cela, vous pouvez obtenir un résultat souhaité 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 kernel. Je pensais que c’était un problème de chargement de symboles. Après avoir essayé toutes les solutions possibles, je ne pouvais toujours pas le faire fonctionner.
Puis je me rappelle faiblement que
ulimit -u illimité
est nécessaire. J’ai essayé et ça a fonctionné comme par magie.
J’ai trouvé à partir de 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
mon dernier ordre était
perf record -F 999 -g ./my_program
n’a pas besoin –call-graph