web-dev-qa-db-fra.com

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

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.

23

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:

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

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

16
mindriot

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 /

3
sotiris

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
1
New to Rails

Que diriez-vous de votre machine hôte dev? Exécute-t-il également le système d'exploitation x86_64?.

1
jumper

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
0
phyrrus9

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 

0
yzark

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

0
Bill Yan

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.

0
Nik_