2013-03-07 9 views
12

Ich möchte eine Funktion während Kernel-Boot-Prozess mit ftrace function_graph verfolgen, um zu verstehen, was es tut, aber es ist nicht verfügbar in available_filter_functions.Wie mache ich eine Linux-Kernel-Funktion für ftrace function_graph tracer verfügbar?

Ich habe versucht, es mit EXPORT_SYMBOL() zu exportieren, raten, dass es zur Verfügung gestellt wird, aber das ist nicht der Fall.

Haben Sie eine Lösung?

Für Informationen, Funktionen, die ich verfolgen möchte, sind persistent_ram_init_ringbuffer und persistent_ram_early_init in Android Kernel 3.4.

ich durch die Dokumentation zu lesen, aber nichts dazu gefunden und grep mehr nicht geholfen ...

Dank

+0

Aus meinem Verständnis von Ftrace, die dynamische Ablaufverfolgung von Funktionen beruht auf einer mcount Funktionsaufruf am Anfang jeder Kernel-Funktion. Wenn die Funktion, an der Sie interessiert sind, nicht anzeigt, dass ein verfügbarer Filter nicht angezeigt wird. Haben Sie in Betracht gezogen, keine dynamische Ablaufverfolgung zu verwenden? Es kann zu besseren Ergebnissen führen. –

+1

EXPORT_SYMBOL scheint mehr mit dem Kernel-Modullader zu tun zu haben, der GPL/Nicht-GPL Lizenzprobleme löst, nicht Ftrace. – bazza

+1

Wenn Sie available_filter_functions auflisten, wird überhaupt etwas aufgelistet? Von was ich sagen kann, wenn Sie einen Kernel mit CONFIG_FUNCTION_TRACER (und allen anderen ftrace gubbins), die eingeschaltet sind, kompilieren, wird die Einlauf-/Ausgangsverfolgung der Kernfunktion implementiert, indem Optionen in der GCC-Befehlszeile gesetzt werden. Diese Optionen bewirken, dass gcc für jede kompilierte Funktion einen bestimmten Funktionsaufruf ausgibt. Wenn ich das richtig verstanden habe, heißt das, dass jede Linux-Kernel-Funktion automatisch von ftrace erfasst werden sollte. Dies führte mich zu der Frage, ob in Ihrem Kernel überhaupt etwas zurückverfolgt werden konnte. – bazza

Antwort

8

Das Problem ist, dass diese Funktionen mit __init und __devinit kommentiert sind, die schwarz von ftrace Funktion Tracer aufgelistet sind.

Warum? Weil sie als Modul-Init-Funktionen (oder Kernel-Init-Funktionen) während der Initialisierung geladen und nach Abschluss der Initialisierung entfernt werden. Jede Funktion, die Spuren verfolgt, wird in einer speziellen kompakten Tabelle gespeichert. Gegenwärtig gibt es keine Möglichkeit, ftrace mitzuteilen, dass diese Funktionen entfernt (freigegeben) wurden und dass ftrace sie aus ihrer Tabelle entfernen sollte. Wenn wir das einfach ignorieren würden, dann wird ftrace, wenn die Funktionstracing aktiviert ist, versuchen, Orte zu verändern, die nicht mehr existieren und alle Arten von Problemen verursachen können (erinnern Sie sich an den e1000e Bug?).

Wenn Sie sie wirklich verfolgen möchten, entfernen Sie diese Anmerkungen. Dann sollten sie in der Liste der zu verfolgenden Funktionen erscheinen.

+0

Vielen Dank für die Antwort. Ich war mir über "notrace", aber nicht über den Umfang von "__init" und "__devinit" im Klaren. –

+1

Wow .... schön dich hier Steven Rostedt zu sehen. Sie sind definitiv einer der ursprünglichen Autoren der ftrace-API im Linux-Kernel. –

+0

Ich kann auch * sched_wakeup * nicht verfolgen, auch wenn es offensichtlich die Flags __init oder __devinit nicht enthält. – Claudio