DTrace-Programmierung
DTrace unterstützt die Programmiersprache D. In diesem Thema wird beschrieben, wie Sie mit dem Schreiben und Verwenden von DTrace-Skripts beginnen.
Allgemeine Informationen zu DTrace unter Windows finden Sie unter DTrace.
Ausführliche Informationen zu DTrace finden Sie in der OpenDTrace-Spezifikation Version 1.0 an der University Of Cambridge.
Hinweis
DTrace wird in den Insider-Builds von Windows nach Version 18980 und Windows Server Build 18975 unterstützt.
Zusätzliche Beispielskripts
Zusätzliche D-Skripts, die für Windows-Szenarien gelten, sind im Beispielverzeichnis des DTrace-Quellcodes verfügbar.
https://github.com/microsoft/DTrace-on-Windows/tree/windows/samples/windows
Eine Reihe von Opentrace-Toolkit-Skripts ist unter https://github.com/opendtrace/toolkitverfügbar.
Hello World
DTrace-Skripts sind einfache Textdateien, die Befehle und D-Programmierskriptelemente enthalten.
dtrace:::BEGIN
{
trace("Hello World from DTrace!");
exit(0);
}
Speichern Sie die Datei als helloworld.d.
Öffnen Sie ein Eingabeaufforderungsfenster als Administrator, und führen Sie das Skript mit der Option -s aus.
dtrace -s helloworld.d
dtrace: script '.\helloworld.d' matched 1 probe
CPU ID FUNCTION:NAME
0 1 :BEGIN Hello World from DTrace!
NtCreateUserProcess-Rückgabezeit
Sie können DTrace-Skripts erstellen, um die Zeit für mehrere Funktionen/Ereignisse nachzuverfolgen. Im Folgenden finden Sie ein einfaches Beispiel, das die NtCreateUserProcess-Funktion zwischen entry/return für den Erstellungsprozess nachverfolgt.
syscall::NtCreateUserProcess:entry
{
self->ts = timestamp;
}
syscall::NtCreateUserProcess:return
{
printf(" [Caller %s]: Time taken to return from create process is %d MicroSecond \n", execname, (timestamp - self->ts)/ 1000);
}
Speichern Sie die Datei als ntcreatetime.d, und verwenden Sie die Option -s, um das Testskript auszuführen.
C:\Windows\system32>dtrace -s ntcreatetime.d
dtrace: script 'ntcreatetime.d' matched 2 probes
CPU ID FUNCTION:NAME
0 183 NtCreateUserProcess:return [Caller svchost.exe]: Time taken to return from create process is 51191 MicroSecond
0 183 NtCreateUserProcess:return [Caller SearchIndexer.]: Time taken to return from create process is 84418 MicroSecond
0 183 NtCreateUserProcess:return [Caller SearchIndexer.]: Time taken to return from create process is 137961 MicroSecond
Dateilösch-Tracker
In diesem Beispielskript wird der Syscall-Anbieter verwendet, um NtOpenFile für den Eintrag zu instrumentieren, und überprüft, ob das Flag übergeben wurde (Argument #5), um Löschvorgänge im gesamten System nachzuverfolgen.
Kopieren Sie das folgende Skript in filedeletetracker.d.
ERROR{exit(0);}
struct ustr{uint16_t buffer[256];};
syscall::NtOpenFile:entry
{
this->deleted = arg5 & 0x00001000; /* & with FILE_DELETE_ON_CLOSE */
if (this->deleted) {
this->attr = (nt`_OBJECT_ATTRIBUTES*)
copyin(arg2, sizeof(nt`_OBJECT_ATTRIBUTES));
if (this->attr->ObjectName) {
this->objectName = (nt`_UNICODE_STRING*)
copyin((uintptr_t)this->attr->ObjectName,
sizeof(nt`_UNICODE_STRING));
this->fname = (uint16_t*)
copyin((uintptr_t)this->objectName->Buffer,
this->objectName->Length);
printf("Process %s PID %d deleted file %*ws \n", execname,pid,
this->objectName->Length / 2,
((struct ustr*)this->fname)->buffer);
}
}
}
Verwenden Sie die Option -s, um das Testskript auszuführen.
Erstellen oder suchen Sie eine Datei, die Sie löschen möchten. Verschieben Sie die Datei in den Papierkorb, und leeren Sie dann den Papierkorb. Wenn die Datei gelöscht wird und das Ereignis ausgelöst wird, und die Informationen zum Löschen der Datei werden angezeigt.
C:\Windows\system32>dtrace -s filedeletetracker.d
dtrace: script 'filedeletetracker.d' matched 8 probes
CPU ID FUNCTION:NAME
0 512 NtOpenFile:entry Process explorer.exe PID 4684 deleted file \??\C:\$Recycle.Bin\S-1-12-1-3310478672-1302480547-4207937687-2985363607\$ROSR3FA.txt
Dieses Programm wurde entwickelt, um weiterhin Dateilöschvorgänge zu überwachen. Drücken Sie STRG+C, um zu beenden.
Weitere größere Codebeispiele finden Sie im nächsten Thema DTrace Windows-Codebeispiele.