AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EventTraceLogger ETW

Ein Thema von himitsu · begonnen am 4. Nov 2022 · letzter Beitrag vom 4. Nov 2022
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#1

EventTraceLogger ETW

  Alt 4. Nov 2022, 22:55
Ich bin ja seit 'ner Weile dabei mit dieser API zu spielen.
-> das Hocheffizienz-Logging-System von Windows (arbeitet intern auf Basis von WMI)
https://learn.microsoft.com/en-us/wi...tracing-portal

Alleine der NT Kernel Logger liefert hier locker 100.000 bis über 'ne Mio Events pro Sekunde.
(ich bin überrascht, daß und wie schnell man 200 Mio Zeilen schrittweise in ein normals TMemo rein bekommt)


Was damit möglich ist, sieht man am Taskmanager und besonders am Ressourcenmonitor.
Der ProcessExplorer wäre auch ein Beispiel, auch wenn Dieser mit Filtertreibern arbeitet, aber großteils mit den Ergebnissen des Eventtracing vergleichbar.
(OK, bezüglich TCP/UDP, Registry- und Festplatten-Zugriff fehlen im Eventlog die geschriebenen/gelesenen Daten, da nur Name und Position geloggt wird, mit teilweise optional zuschaltbarem Stacktrace)



Gemein ist, dass große Teile der Dokumentation des Herstellers einfach falsch sind (falsche Typen ... meistens als 32 Bit-Typ beschrieben (z.B. UINT32), aber oftmals immer 64 Bit (POINTER/HANDLE), auch wenn man für Win32 kompiliert),
auch sind die Versionen/Nummern oft veraltet oder grundsätzliche falsch beschrieben und viele Operationen/Opcodes fehlen in der Doku.
-> Beispiel siehe Demoanwendung

Ich arbeite aktuell meistens mit Win32, da im Delphi 11.2 für Win64 das Debuggen eine unmögliche Quall ist.


"The Worst API Ever Made"
https://caseymuratori.com/blog_0025
Gut, ein Teil bezüglich seiner Analyse stimmt nicht, aber sonst kann ich ihn gut verstehen.

"32 event types should be enough for everyone" ... Bit 31 ist undokumentiert, aber es schaltet (wohl) eine Liste zu, wo mehr rein passten würde. (32 Bit ListenRecords = 4 Milliarden anstatt BitMask)
Und die 32 "Flags" beziehen sich auch immer nur auf den jeweiligen Logger, wo man sich registriert. Andere Logger nutzen es nicht, oder haben eine eigene Definition dieser Flags.





Aktuell nur als Realtime-Logger registrieren und mitlesen,
gespeicherte Logs lesen würde aber auch gehen, bzw. nur das Logschreiben (in Datei) starten und später auslesen.

Und erstmal für den "NT Kernel Logger" und dessen Möglichkeiten
https://learn.microsoft.com/en-us/wi...nt-systemtrace

Beispiel einiger Möglichkeiten bezüglich .NET
https://youtu.be/qGEeZZBwVp4?t=640
https://github.com/microsoft/perfview
Neben dem NT Kernel Logger gibt es noch viel mehr, wie z.B. Einen für's .NET-Framework und dessen MethodenTracing und Speichermanagement/GarbageCollector.



Selbst ins Log schreiben will ich aber auch irgendwann können und hoffe Emba kopiert es teilweise bei "sich" rein.
-> TMonitor und Thread.Synchronize bzw. Queue (default aus, aber aktivierbar)

Denn TCriticalSection schreibt da rein, aber System.TMonitor nicht.
Es wäre jedenfalls bestimmt praktisch, wenn man, ähnlich dem Video, bezüglich Sperren eine Analyse starten könnte, um z.B. Deadlocks (rück)zuverfolgen.




Im Anhang ein erstes BasisLogging, mit auskommentieren halbfertigen Auswertungen (Records in einzelne Werte zerlegen und für Namensauflösungen verknüpfen)
Also ich schreibe die Rohdaten von ALLEM mit und versuche dafür den ProviderName und OpcodeName aufzulösen, in Bezug der ProviderID + Version.
Ist wichtig, um das versionsabhängige jeweilige DatenFormat bestimmen zu können.
Wo es nicht klappt, dann steht anstatt "Name"
* "123~Name" für bekannten/gleichen Opcode (mir bekannt, bzw. laut Doku), aber nicht in der empfangen Version enthalten
* "Opcode-C81-V02-11D0FE053D6FA8D3" für unbekannten Opcode in allen bekannten Versionen der jeweiligen ProviderId
* "Version-V02-11D14A3E68FDD900" für unbekannte Verion
* "Provider-123456789ABCDEF0" für unbekannten Provider
* ...

Vorhin noch schnell eine Checklisbox eingebaut, zur Einschränkung dieses Loggers.
* Programm sollte als Admin laufen
* für "sample base profiling" muß wohl noch irgendeine Berechtigung aktiviert/abgerufen werden ... ausführen als Admin reicht nicht aus
* unten der Button für eine Schnellauswahl mehrmals Links, bzw. einmal mit Rechts knuffen

Headerübersetzung wird, wenn sie halbwegs "stimmig" ist, freigeben (wie gesagt, aktuell sind zuviele Fehler drin, obwohl ich schon Vieles durch Selbstversuche und Abgleich mit anderen Dokus/Demos berichtigt hab)




Pervers wird es, wenn man die "page faults" aktiviert ... einige Programme (Firefox, BDS) bestehen scheinbar nur aus heimlichen/abgefangenen (quasi try-except) AccessViolations.
https://www.digiater.nl/openvms/doc/...91pro_006.html -> 7.2.1.1 Hard and Soft Page Faults
Miniaturansicht angehängter Grafiken
eventlogger.png   eventlogger2.jpg  
Angehängte Dateien
Dateityp: 7z EventLogger.exe.7z (898,2 KB, 4x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Nov 2022 um 15:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#2

AW: EventTraceLogger ETW

  Alt 4. Nov 2022, 23:10
DbgPrint lässt sich zwar ohne Fehlermeldung im Logger aktivieren (auch wenn es in der offiziellen Doku nicht drin steht, aber in der MOF finde ich es und Andere haben es auch in Systemdateien nachgewiesen),
aber es wird nichts empfangen.

Weder stundenlang von irgendeinem Programm im Windows, noch wenn ich es selber aufrufe.

Delphi-Quellcode:
function DbgPrint(Format: PAnsiChar): ULONG; cdecl; varargs;
  external 'NtDll.dllname 'DbgPrint';

function DbgPrintEx(ComponentId, Level: ULONG; Format: PAnsiChar): ULONG; cdecl; varargs;
  external 'NtDll.dllname 'DbgPrintEx';

procedure TForm13.FormCreate(Sender: TObject);
begin
  DbgPrint('%i %X', 12345, 12345);
  DbgPrintEx(77{DPFLTR_IHVDRIVER_ID}, $1 shl 0{DPFLTR_ERROR_LEVEL}, '%i %X', 12345, 12345);
  OutputDebugString('abcde');
end;
Nja, vielleicht funktioniert es nur aus einem Treiber heraus
und außerdem lese ich öffters, dass die API nichts sendet, wenn ID/Level nicht stimmen, bzw. nicht aktiviert wurden. (oder irdendwie so)
MSDN-Library durchsuchenDbgPrint
Zitat:
The DbgPrint routine sends a message to the kernel debugger.

In Windows Vista and later versions of Windows, DbgPrint sends a message only when the conditions that you specify apply (see the Remarks section for information).



MOF: siehe *.mof in C:\Windows
oder C:\Program Files (x86)\Windows Kits (vom Delphi)

bzw. siehe auch C:\ -> Defender, .NET Framework, Powershell, ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 4. Nov 2022 um 23:18 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz