39 Stimmen

Wie kann ich Perf dazu bringen, Symbole in meinem Programm zu finden?

Bei der Verwendung von perf report Ich sehe keine Symbole für mein Programm, stattdessen erhalte ich eine Ausgabe wie diese:

$ 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  

Das ist ziemlich uninformativ.

Das entsprechende Programm wird mit Debugging-Symbolen erstellt, und die sysprof Tool zeigt die entsprechenden Symbole an, ebenso wie Zoom, das meiner Meinung nach die perf unter der Haube.

Beachten Sie, dass dies auf x86-64 läuft, so dass die Binärdatei mit -fomit-frame-pointer aber das ist auch bei den anderen Tools der Fall.

39voto

mindriot Punkte 5103

Dieser Beitrag ist schon über ein Jahr alt, aber da er bei meinen Google-Suchergebnissen ganz oben auftauchte, als ich das gleiche Problem hatte, dachte ich, ich würde ihn hier beantworten. Nach weiterem Herumstöbern fand ich die Antwort in dieser verwandten StackOverflow-Frage sehr hilfreich. Auf meinem Ubuntu Raring System habe ich dann folgendes gemacht:

  1. Kompiliere meine C++-Quellen mit -g (ziemlich offensichtlich, man braucht Debugsymbole)

  2. ausführen. perf als

    record -g dwarf -F 97 /path/to/my/program

    Auf diese Weise perf ist in der Lage, die DWARF 2 Debug-Format, das das Standardformat ist gcc unter Linux verwendet. Die -F 97 wird die Abtastrate auf 97 Hz reduziert. Die Standardabtastrate war offenbar zu hoch für mein System und führte zu Meldungen wie dieser:

    Warning:
    Processed 172390 events and lost 126 chunks!
    
    Check IO/CPU overload!

    und die perf report Der anschließende Aufruf würde mit einem Segmentierungsfehler fehlschlagen. Mit der reduzierten Abtastrate funktionierte alles einwandfrei.

  3. Sobald die perf.data Datei im vorherigen Schritt fehlerfrei erzeugt wurde, können Sie perf report usw. Ich persönlich mag die FlameGraph Werkzeuge zur Erstellung von SVG-Visualisierungen.

  4. Andere Menschen berichtet, dass das Laufen

    echo 0 > /proc/sys/kernel/kptr_restrict

    as Root kann ebenfalls helfen, wenn Kernel-Symbole benötigt werden.

6voto

sotiris Punkte 305

In meinem Fall bestand die Lösung darin, die elf Dateien zu löschen, die zwischengespeicherte Symbole aus früheren Builds enthielten und die Dinge durcheinander brachten.

Sie befinden sich im Ordner ~/.debug/.

2voto

Bill Yan Punkte 3219

Ich hatte dieses Problem auch, ich konnte kein Userspace-Symbol sehen, aber ich sah einige Kernelsymbole. Ich dachte, es handele sich um ein Problem beim Laden von Symbolen. Nachdem ich alle möglichen Lösungen ausprobiert hatte, die ich finden konnte, konnte ich es immer noch nicht zum Laufen bringen.

Dann erinnere ich mich schwach daran, dass

ulimit -u unbegrenzt

erforderlich ist. Ich habe es versucht und es hat auf magische Weise funktioniert.

Ich habe in diesem Wiki gefunden, dass dieser Befehl benötigt wird, wenn man zu viele Dateideskriptoren verwendet.

https://perf.wiki.kernel.org/index.php/Tutorial#Troubleshooting_and_Tips

mein letzter Befehl lautete

perf record -F 999 -g ./my_program

brauchte nicht --call-graph

1voto

phyrrus9 Punkte 1441

Sie können jederzeit den Befehl '$ nm' verwenden.

Hier ist eine Beispielausgabe:

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

0voto

New to Rails Punkte 2774

Stellen Sie sicher, dass Sie das Programm mit der Option -g zusammen mit gcc(cc) kompilieren, damit die Debugging-Informationen im systemeigenen Format des Betriebssystems erzeugt werden. Versuchen Sie Folgendes und prüfen Sie, ob Debugsymbole in der Symboltabelle vorhanden sind.

$objdump -t your-elf 
$readelf -a your-elf
$nm -a your-elf

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X