Einen DTrace-Consumer in C schreiben

8

Ich würde gerne ein C-Programm unter FreeBSD 10.1 schreiben, das einen DTrace-Consumer mit libdtrace implementiert.

Ich weiß, dass ich mit einem Aufruf von dtrace_open() beginnen muss - z. Ich habe diese alte Präsentation gefunden, aber ich kann nicht einmal anfangen, da es keine gibt dtrace.h installiert (nur in der Systemquellstruktur).

Die gemeinsam genutzte Bibliothek ist z.B. Das in FreeBSD enthaltene Tool /usr/sbin/dtrace kann als DTrace-Consumer fungieren, und dieses Tool stellt eine Verbindung zu /lib/libdtrace.so.2 her (auf die auch über einen symbolischen Link von /usr/lib/libdtrace.so verwiesen wird).

Jedes grundlegende Beispiel, einschließlich Build-Anweisungen (FreeBSD 10.1 / clang), wird mir sehr helfen.

Das eigentliche Ziel beim Schreiben eines benutzerdefinierten Verbrauchers ist das Erstellen eines CFFI basierten Wrappers, der in Python und PyPy . Bedeutet: über C-Programm ist nur um zu beginnen, zu lernen und dann fortzufahren.

CFFI ist die empfohlene, moderne und hochleistungsfähige Art der Verbindung von PyPy mit gemeinsam genutzten Bibliotheken.

CFFI kann auf ABI und API-Ebene verwendet werden. Letzteres erfordert das Einbinden einer Header-Datei, die erstere erfordert das Deklarieren des verwendeten Materials aus einer Lib.

Angepasst an Adams Antwort, hier ist ein vollständiges Beispiel, das unter FreeBSD 10.1 funktioniert.

Makefile :

%Vor%

hello_dtrace.c :

%Vor%

Zum Ausführen:

%Vor%     
oberstet 18.01.2015, 15:38
quelle

2 Antworten

7

Die libdtrace API ist nicht unbedingt für stabile Konsumenten gedacht, aber es ist ziemlich einfach, von einigen bestehenden Konsumenten zu lernen, um loszulegen. Das einfachste und modernste ist plockstat , Das illumos-Dienstprogramm für Benutzer-Land-Sperrstatistiken.

Hier ist der grundlegende Ablauf eines einfachen DTrace-Consumer-Programms:

dtrace_open() , um ein dtrace_hdl_t, ein Handle für andere libdtrace Interaktionen und dtrace_setopt() zu erhalten, um Optionen zu konfigurieren ( -x flag bis dtrace(1M) ) und dtrace_strcompile() , um eine Zeichenkette von D-Programm
dtrace_program_exec() , um dieses Programm an den Kernel zu senden
dtrace_go() , um das System zu instrumentieren und die Datenaufzeichnung zu starten
dtrace_close() , um am Ende aufzuräumen

Gehen Sie für die Hauptdatensammlungsschleife (zwischen dtrace_go() und dtrace_close() ) wie folgt vor:

dtrace_sleep() , um entsprechend den DTrace-Optionen zu pausieren (switchrate und aggrate)

co_de% verarbeitet verfolgte Daten
dtrace_work() bricht ab

Siehe die Hauptschleife in dtrace_stop() für mehr.

Weitere einfache DTrace-Nutzer finden Sie unter plockstat.c und intrstat . Für die Küchenspüle sollten Sie den Code des Befehlszeilenprogramms dtrace (1M) lesen.

    
ahl 25.01.2015, 05:12
quelle
3

dtrace wird als systeminterne Schnittstelle betrachtet und das Schreiben eines benutzerdefinierten Consumers wird nicht unterstützt.

Das Beste, was Sie tun können, ist eine Kopie der FreeBSD-Source-Struktur zu sehen und Ihren Code von dort zu erstellen. Das ist eigentlich nicht besonders schwierig. Offensichtlich ist dtrace(1) der kanonische Dtrace-Consumer, daher können Sie in der Implementierung nach Beispielen für die Verwendung von libdtrace suchen. Zusätzlich enthält dtrace.h eine Menge Kommentare, die Datenstrukturen und Interna erklären.

Das Erstellen der Dateien im Kontext des Quellbaums ist ziemlich einfach. Das FreeBSD-Source-Tree-Layout ist einfach und das Schreiben von Makefiles zum Erstellen von Binärdateien in einer selbständigen Art und Weise wird Ihnen grundsätzlich "kostenlos" gegeben.

Wichtige Punkte:

  • Klonen dtrace (1) Makefile in ein neues Verzeichnis in Ihrem Source-Tree-Checkout. Ändern Sie das Makefile so, dass .PATH korrekt ist, und legen Sie PROG und SRCS fest, um die Menge der Quellen einzubeziehen, aus denen Ihr benutzerdefinierter Consumer besteht.

  • Klonen dtrace .c zu Ihrem Quellverzeichnis (wohin Sie .PATH gezeigt haben) und nehmen Sie Änderungen nach Bedarf vor. Obwohl die Quelle fast 2000 Zeilen umfasst, ist ein Großteil davon Support-Code. Wenn Sie nur eine Teilmenge der Funktionalität klonen möchten, werden Sie feststellen, dass die meisten Optionen für die Binärdatei in eigenständigen Funktionen implementiert sind. Daher sollte es relativ einfach sein, dtrace.c auf eine leere Zahl zu reduzieren -Minimale Form.

Ohne zu wissen, was genau Sie mit Ihrem benutzerdefinierten Kunden tun müssen, ist es schwierig, Ihnen zu sagen, wofür Sie sonst noch anrufen müssen. Ich nehme an, dass Sie wahrscheinlich möchten compile_file da drin sowie exec_prog . Natürlich können Ihre Bedürfnisse abweichen.

Die dtrace.h , die Sie verwenden werden , enthält eine Reihe von Kommentaren zu den verschiedenen bereitgestellten Schnittstellen.

Hoffentlich reicht das, um Sie zu beginnen; Leider gibt es bei Vanilla-Installationen keine Möglichkeit, das zu tun, was Sie wollen. Sie könnten natürlich die entsprechenden Makefiles hacken, um die notwendigen Header-Dateien zu installieren und Ihre eigene interne Distribution zu erstellen. Aber das scheint mehr Schmerz als es wert ist.

    
dho 21.01.2015 19:15
quelle

Tags und Links