libfaketime für Windows
Kurze Antwort: libfaketime läuft unter Windows nicht und kann es nicht - es baut
auf LD_PRELOAD auf, das Windows nicht kennt. Chrono Mock ist dieselbe Idee, so gebaut,
wie Windows es zulässt.
Warum es sich nicht einfach portieren lässt
libfaketime funktioniert, indem der dynamische
Lader eine kleine Bibliothek vor die C-Bibliothek setzt, sodass die Aufrufe eines Programms an
time() zuerst beim Ersatz ankommen. Dieser Haken heißt unter Linux
LD_PRELOAD und unter macOS DYLD_INSERT_LIBRARIES. Die eigene README
listet genau diese beiden Plattformen.
Windows hat nichts Vergleichbares, und seine Uhr liegt ohnehin nicht hinter einer einzigen Funktion. Anwendungen lesen die Zeit über die Win32-API, über die native API darunter und über alles, was ihre Laufzeit um die eine oder andere wickelt - die Windows-Version dieser Idee ist also eine in den Zielprozess eingeschleuste Bibliothek, die eine Menge exportierter Funktionen umleitet statt eines einzelnen Symbols.
Die Optionen, übertragen
| libfaketime | Chrono Mock |
|---|---|
FAKETIME="2020-12-24 20:30:00" |
--at 2020-12-24T20:30:00 |
FAKETIME="+14d" |
--at +14d |
FAKETIME="-10m" |
--at -10m |
FAKETIME="+0 x2" |
--mode x2 |
FAKETIME_DONT_FAKE_MONOTONIC=1 |
hier der Standard - siehe unten |
LD_PRELOAD=libfaketime.so.1 |
nichts zu setzen - das Werkzeug injiziert |
So sehen die beiden Seiten desselben Tests aus:
# Linux FAKETIME="2020-12-24 20:30:00" LD_PRELOAD=/usr/local/lib/libfaketime.so.1 ./test # Windows chrono run "C:\apps\test.exe" --at 2020-12-24T20:30:00
Wo sich beide wirklich unterscheiden
Monotone Uhren sind umgekehrt. libfaketime fälscht sie standardmäßig und bietet
FAKETIME_DONT_FAKE_MONOTONIC, um das zu stoppen. Hier bleibt der hochauflösende
Zähler standardmäßig echt, weil seine Skalierung im Test das Rendering destabilisiert hat, und
--scale-qpc schaltet sie ein. Dieser Schalter lässt Python-3.13+-monotonic,
.NET-Stopwatch und Java-nanoTime der Sitzungsuhr folgen.
Windows hat mehr Stellen zum Abfangen. Neben der Wanduhr gibt es die Zeitzone, die Achse der verstrichenen Zeit, vier Familien von Timern, die Sleep- und Wait-Funktionen und die Prozesserzeugung - insgesamt 44 Kanäle. Davon werden 30 verschoben, die übrigen 14, darunter Netzwerkverbindungen, werden gezählt.
Dieses Werkzeug meldet seine eigene Abdeckung. Jede Sitzung endet mit einem Urteil, den Kanälen, die die Anwendung tatsächlich gelesen hat, mit der Zahl je Kanal, und den Kanälen, die verfehlt wurden. Das ist der Teil, der auf keiner der beiden Plattformen ein Gegenstück hat.
libfaketime ist auf seinem eigenen Gebiet älter und breiter. Es hat Jahre im Einsatz hinter sich, deckt eine große Zahl von Einstiegspunkten der C-Bibliothek ab, und unter Linux ist es das richtige Werkzeug. Nichts hier ersetzt es dort.
Wenn Sie tatsächlich libfaketime selbst wollen
Zwei ehrliche Wege, die beide das zu testende Programm auf Linux verlegen:
- WSL - libfaketime im Linux-Subsystem bauen und ausführen. Das passt, wenn das Getestete ein Linux-Programm ist, das Sie zufällig unter Windows entwickeln.
- Ein Container - dieselbe Idee, reproduzierbarer.
Beides hilft bei einer Windows-Anwendung nicht, und für diesen Fall gibt es dieses Werkzeug.