Comment puis-je obtenir perf pour trouver des symboles dans mon programme

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:

  1. Comstackr mes sources C ++ avec -g (assez évident, vous avez besoin de symboles de débogage)
  2. 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é.

  3. Une fois que le fichier 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.
  4. 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